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