实现支持逻辑搜索/单词搜索/词组搜索+支持OR/AND关键字的VBS CLASS!

时间:2021-05-18

CLASS功能.替换传入的字符串成为SQL语句Where关键字后面的表达式:

词语搜索[例如:小明]

词组搜索
词组里面每一个词都将被检索
例如:小强1小名1小强强小小强

逻辑搜索
支持And和Or运算符.
例如:小明And小强And小小强

复合条件:
例如:(小小明Or小明)And(小强Or小小强)
例如:(小小明Or小名)And小小强
例如:ROOT1And(广东人Or北京人)
-----------------------------------------------------------
复制代码 代码如下:
ClassCreateQueryString

PublicobjReg
PublicintStart
PublicstrField
PrivateobjNode2
PrivatestrText

PublicPropertyLetQueryString(strValue)
strText=Lcase(strValue)
EndProperty

PrivateSubClass_Initialize()
SetobjReg=newRegExp
strField="(标题+文章)"
EndSub

PrivateSubClass_Terminate()
SetobjReg=Nothing
EndSub

PublicDefaultFunctionGetText()
DimblnRes
DimstrSky
WithobjReg
.IgnoreCase=true
.Global=True
.Pattern="\s"
blnRes=.Test(strText)
EndWith
If(NotblnRes)Then
intStart=2
GetText=strField&"like'%"&strText&"%'"
Else
objReg.Pattern="\sand|\sor"
blnRes=objReg.Test(strText)
IfblnResThen
strSky=check()
IfstrSky=FalseThen
GetText=wahaha()
Else
GetText=strSky
Endif
Else
GetText=wahaha()
Endif
EndIf
EndFunction

PrivateFunctionwahaha()
DimstrTer
DimstrLikes
DimstrOrs
DimstrI
DimobjRe
strTer=""
strLikes="or("&strField&"like'%"
strOrs="%')"
objReg.Pattern="(\S*\S)"
SetobjRe=objReg.Execute(strText)
ForEachstrIInobjRe
strTer=strTer&strLikes&strI&strOrs
Next
wahaha=Mid(strTer,4)
intStart=3
EndFunction

PrivateFunctionCheckYes(strMode,intCount)
DimobjNode1
objReg.Pattern=strMode
SetobjNode1=objReg.Execute(strText)
IfobjNode1.Count<1Then
CheckYes=True
Else
SetobjNode2=objNode1(0)
IfobjNode2.subMatches.Count<intCountThen
CheckYes=True
EndIf
EndIf
EndFunction

PrivateFunctionORAND()
DimstrSSS
DimstrCCC
DimstrAAA
Dima143
Dimi
DimobjN
DimblnTru
DimblnBBB
strSSS="("&strField&"like'%"
strCCC="%')"
strAAA=""
n1=0
blnTru=True
blnBBB=True

objReg.Pattern="(\S*\S)"
SetobjN=objReg.Execute(strText)
a143=objN.Count-1
If(objN.Item(a143)="and")Or(objN.Item(a143)="or")Then
ORAND=False
ExitFunction
Endif
ForEachiInobjN
IfblnTruThen
If(i<>"and")And(i<>"or")Then
blnTru=False
strAAA=strAAA&strSSS&i&strCCC
Else
blnBBB=false
Exitfor
Endif
Else
If(i="and")Or(i="or")Then
blnTru=True
strAAA=strAAA&i
Else
blnBBB=False
ExitFor
Endif
Endif
Next
If(NotblnBBB)Then
ORAND=False
Else
ORAND=strAAA
intStart=4
Endif
EndFunction



PrivateFunctioncheck()
Dimre
Dimre1
Dimre2
Dimre3
Dimstr
Dimstr1
Dima1
Dima2
Dima3
Dima4
str=strField&"like'%"
str1="%'"
WithobjReg
.Pattern="^\(.+\)\s(and|or)\s"
re=.Test(strText)
.Pattern="\s(and|or)\s\(.+\)$"
re3=.Test(strText)
EndWith
IfreAndre3Then
IfCheckYes("^\((\S*\S)(\bor\b|\band\b)(\S*\S)\)(and|or)\((\S*\S)(\bor\b|\band\b)(\S*\S)\)$",6)Then
check=False
Else
WithobjNode2
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
EndWith
EndIf
ElseIfreThen
IfCheckYes("^\((\S*\S)(\bor\b|\band\b)(\S*\S)\)(and|or)(.+)",4)Then
check=False
Else
WithobjNode2
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
EndWith
EndIf
ElseIfre3Then
IfCheckYes("(.+)(and|or)\((\S*\S)(\bor\b|\band\b)(\S*\S)\)$",4)Then
check=False
Else
WithobjNode2
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
EndWith
EndIf
Else
check=ORAND()
EndIf
EndFunction

EndClass

-------------------------注意-----------------------------
替换好的字符串并不是完整的SQL语句.只是生成SQL语句的WHERE关键字后面的表达式.发送到ASP程序的时候.你可以在前面加上
"selectid,标题,name,TableNamefromSearchAllwhere"
这样类似的SQL语句
-------------------------VBScript例子-----------------------------
DimobjROOT1
SetobjROOT1=newCreateQueryString
objROOT1.QueryString=strText'====传入要替换的字符串
objROOT1.strField="要查询的字段名字"'===如果不设置.默认值是"(标题+文章)"
strText=objROOT1()'=========得到替换好的SQL语句
If(objQueryString.intStart=4)Then
CallMsgbox("启动按逻辑搜索")
EndIf
SetobjROOT1=Nothing

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章