我有一些正则表达式代码,用于抓取页面上标题标记之间的数据:
<%
Function UrlExists(sURL)
Dim objXMLHTTP
Dim thePage
Dim strPTitle
Dim blnReturnVal
Dim objRegExp
Dim strTitleResponse
'Create object
Set objXMLHTTP = CreateObject("MSXML2.ServerXMLHTTP")
on error resume next
'Get the head
objXMLHTTP.Open "HEAD", sURL, false
objXMLHTTP.setRequestHeader "User-Agent", Request.ServerVariables("HTTP_HOST")
objXMLHTTP.Send ""
'404?
If Err.Number <> 0 or objXMLHTTP.status <> 200 then blnReturnVal = "0|404 Error" Else blnReturnVal = "1|"
objXMLHTTP.close
'If not 404
if left(blnReturnVal,1) = "1" then
'Get the physical page
objXMLHTTP.Open "GET", sURL, false
objXMLHTTP.Send ""
thePage = objXMLHTTP.responseText
thePage = replace(thePage, vbCrlf, "")
objXMLHTTP.close
'Find title
Set objRegExp = New Regexp
objRegExp.IgnoreCase = true
objregexp.Multiline = true
objRegExp.Global = false
objRegExp.Pattern = "<title[^>]*?>(.*)</title>"
set strPTitle = objRegExp.Execute(thePage)
strTitleResponse = strPTitle.Item(0).Value
strTitleResponse = replace(strTitleResponse, vbCrlf, "")
strTitleResponse = trim(strTitleResponse)
if len(strTitleResponse) <1 OR strTitleResponse = "" then strTitleResponse = "(No Title)"
set objRegExp = nothing
strTitleResponse = replace(strTitleResponse,"</title>","")
strTitleResponse = replace(strTitleResponse,"<title>","")
strTitleResponse = replace(strTitleResponse,"'","' ")
blnReturnVal = blnReturnVal & strTitleResponse
end if
Set objXMLHTTP = nothing
UrlExists = blnReturnVal
End Function
%>
这很好用,已经好几个月,但是当我写它(愚蠢?)时我假设每个页面只有一个或没有标题标签。它最近开始在John Lewis page上抛出奇怪的错误,因为它的HTML中有两个标题:
<title>John Lewis - Shop online at Britain's Favourite Retailer</title>
... bunch of html
<title>
</title>
如何修改正则表达式以仅匹配第一个匹配的对,而不是与上面的HTML混淆?
答案 0 :(得分:1)
在所有这些之前“你应该使用解析器”:让你正则表达式non-greedy:
objRegExp.Pattern = "<title[^>]*?>(.*?)</title>"
请注意?
之后添加的.*
。默认.*
将尽可能匹配 。此行为与附加?
相反,现在匹配尽可能少。
警告:我对经典ASP(或“现代”ASP,如果有这样的东西)的正则表达式一无所知,但由于非贪婪/懒惰运算符已经用于<title>
标记匹配,我认为它会起作用。