我有一些正则表达式代码来获取页面上title标记之间的数据:
<%
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>如何修改regexp,使其只匹配第一个匹配对,而不会与上面的HTML混淆?
发布于 2010-10-26 17:45:15
在所有这些“你应该使用解析器”之前:让你正则表达式non-greedy
objRegExp.Pattern = "<title[^>]*?>(.*?)</title>" 注意在.*之后添加的?。默认情况下,.*将尽可能匹配。这种行为与额外的?相反,现在尽可能少地匹配。
警告:我对经典的ASP (或者“现代”ASP,如果有的话)的正则表达式一无所知,但是由于非贪婪/懒惰操作符已经在<title>标签匹配上使用了,我认为它会起作用。
https://stackoverflow.com/questions/4022440
复制相似问题