|
CLASS功能.替换传入的字符串成为SQL语句Where关键字后面的表达式:
词语搜索 [例如: 小明]
词组搜索 词组里面每一个词都将被检索 例如: 小强1 小名1 小强强 小小强
逻辑搜索 支持 And 和 Or 运算符. 例如: 小明 And 小强 And 小小强
复合条件: 例如:(小小明 Or 小明) And (小强 Or 小小强) 例如:(小小明 Or 小名) And 小小强 例如: ROOT1 And (广东人 Or 北京人) ----------------------------------------------------------- 复制代码 代码如下: Class CreateQueryString
Public objReg Public intStart Public strField Private objNode2 Private strText
Public Property Let QueryString( strValue ) strText = Lcase( strValue ) End Property
Private Sub Class_Initialize() Set objReg = new RegExp strField = "(标题+文章)" End Sub
Private Sub Class_Terminate() Set objReg = Nothing End Sub
Public Default Function GetText() Dim blnRes Dim strSky With objReg .IgnoreCase = true .Global = True .Pattern = "\s" blnRes = .Test( strText ) End With If (Not blnRes) Then intStart = 2 GetText = strField & " like '%" & strText & "%'" Else objReg.Pattern = "\sand|\sor" blnRes = objReg.Test( strText ) If blnRes Then strSky = check() If strSky = False Then GetText = wahaha() Else GetText = strSky End if Else GetText = wahaha() End if End If End Function
Private Function wahaha() Dim strTer Dim strLikes Dim strOrs Dim strI Dim objRe strTer = "" strLikes = " or (" & strField & " like '%" strOrs = "%')" objReg.Pattern = "(\S*\S)" Set objRe = objReg.Execute(strText) For Each strI In objRe strTer = strTer & strLikes & strI & strOrs Next wahaha = Mid( strTer , 4 ) intStart = 3 End Function
Private Function CheckYes( strMode , intCount) Dim objNode1 objReg.Pattern = strMode Set objNode1 = objReg.Execute( strText ) If objNode1.Count < 1 Then CheckYes = True Else Set objNode2 = objNode1( 0 ) If objNode2.subMatches.Count < intCount Then CheckYes = True End If End If End Function
Private Function ORAND() Dim strSSS Dim strCCC Dim strAAA Dim a143 Dim i Dim objN Dim blnTru Dim blnBBB strSSS = "(" & strField & " like '%" strCCC = "%')" strAAA = "" n1 = 0 blnTru = True blnBBB = True
objReg.Pattern = "(\S*\S)" Set objN = objReg.Execute( strText ) a143 = objN.Count - 1 If (objN.Item( a143 ) = "and") Or (objN.Item( a143 ) = "or") Then ORAND = False Exit Function End if For Each i In objN If blnTru Then If (i <> "and") And (i <> "or") Then blnTru = False strAAA = strAAA & strSSS & i & strCCC Else blnBBB = false Exit for End if Else If (i = "and") Or (i = "or") Then blnTru = True strAAA = strAAA & i Else blnBBB = False Exit For End if End if Next If (Not blnBBB) Then ORAND = False Else ORAND = strAAA intStart = 4 End if End Function
Private Function check() Dim re Dim re1 Dim re2 Dim re3 Dim str Dim str1 Dim a1 Dim a2 Dim a3 Dim a4 str = strField & " like '%" str1 = "%'" With objReg .Pattern = "^\(.+\)\s(and|or)\s" re = .Test( strText ) .Pattern = "\s(and|or)\s\(.+\)$" re3 = .Test( strText ) End With If re And re3 Then If CheckYes( "^\((\S*\S) (\bor\b|\band\b) (\S*\S)\) (and|or) \((\S*\S) (\bor\b|\band\b) (\S*\S)\)$" , 6 ) Then check = False Else With objNode2 a1 = .submatches(0) a2 = .submatches(2) a3 = .submatches(4) a4 = .submatches(6) check = "(" & str & a1 & str1 & " " & .submatches(1) & " " & str & a2 & str1 & ") " &_ .submatches(3) & " (" & str & a3 & str1 & " " & .submatches(5) & " " & str & a4 & str1 & ")" intStart = 5 End With End If ElseIf re Then If CheckYes( "^\((\S*\S) (\bor\b|\band\b) (\S*\S)\) (and|or) (.+)" , 4 ) Then check = False Else With objNode2 a1 = .submatches(0) a2 = .submatches(2) a3 = .submatches(4) check = "(" & str & a1 & str1 & " " & .submatches(1) & " " & str & a2 & str1 & ") " &_ .submatches(3) & " (" & str & a3 & str1 & ")" intStart = 5 End With End If ElseIf re3 Then If CheckYes( "(.+) (and|or) \((\S*\S) (\bor\b|\band\b) (\S*\S)\)$" , 4 ) Then check = False Else With objNode2 a1 = .submatches(0) a2 = .submatches(2) a3 = .submatches(4) check = "(" & str & a1 & str1 & ") " & .submatches(1) & " (" & str & a2 & str1 & " " &_ .submatches(3) & " " & str & a3 & str1 & ")" intStart = 5 End With End If Else check = ORAND() End If End Function
End Class
-------------------------注意----------------------------- 替换好的字符串并不是完整的SQL语句.只是生成SQL语句的WHERE关键字后面的表达式.发送到ASP程序的时候.你可以在前面加上 "select id,标题,name,TableName from SearchAll where " 这样类似的SQL语句 -------------------------VBScript例子----------------------------- Dim objROOT1 Set objROOT1 = new CreateQueryString objROOT1.QueryString = strText '====传入要替换的字符串 objROOT1.strField = "要查询的字段名字" '===如果不设置.默认值是"(标题+文章)" strText = objROOT1() '=========得到替换好的SQL语句 If (objQueryString.intStart = 4) Then Call Msgbox("启动按逻辑搜索") End If Set objROOT1 = Nothing
|
|