Классический ASP RegExp небольшие изменения - PullRequest
0 голосов
/ 26 октября 2010

У меня есть код регулярного выражения, который переносит данные между тегами заголовка на странице:

<%
    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,"'","&#39; ")
            blnReturnVal = blnReturnVal & strTitleResponse

        end if

        Set objXMLHTTP = nothing

        UrlExists = blnReturnVal
    End Function
%>        

Это прекрасно работает и уже много месяцев, но когда я написал это (глупо?), Я сделал предположение, что на каждой странице будет только один или нет тегов заголовка. Недавно он начал выдавать странные ошибки на странице Джона Льюиса , потому что в HTML есть два заголовка:

    <title>John Lewis - Shop online at Britain's Favourite Retailer</title>
... bunch of html
<title>

    </title>

Как я могу изменить регулярное выражение, чтобы оно соответствовало только первой сопоставленной паре, не путаясь с приведенным выше HTML-кодом?

1 Ответ

1 голос
/ 26 октября 2010

Перед всем этим «вы должны использовать синтаксический анализатор»: сделайте регулярное выражение нежадным :

objRegExp.Pattern = "<title[^>]*?>(.*?)</title>" 

Обратите внимание на добавленное ? после .*.По умолчанию .* будет соответствовать максимально .Это поведение инвертируется дополнительными ?, теперь соответствующими как можно меньшим .

Предупреждение : я ничего не знаю о регулярных выражениях в классическом ASP (или«современный» ASP, если есть такая вещь), но поскольку оператор несжатости / лени уже используется в теге <title>, я считаю, что он будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...