源码
资讯
  当前位置:源码网网络学院网络编程ASP教程 → 实现支持逻辑搜索/单词搜索/词组搜索+支持OR/AND关键字的VBS CLASS
特别推荐
热点TOP10
本周下载排行
本月下载排行
实现支持逻辑搜索/单词搜索/词组搜索+支持OR/AND关键字的VBS CLASS
日期:2006年2月28日 作者: 人气: 查看: [大字体 中字体 小字体]
     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

(出处:源码网)

百度搜索 Google搜索 雅虎搜索 我要投稿
相关文章: 相关软件: