Использование регулярных выражений в Classic ASP для получения содержимого определенных элементов

Поэтому я загружаю некоторый удаленный контент, и мне нужно использовать регулярные выражения, чтобы изолировать содержимое некоторых тегов.

  set xmlhttp = CreateObject("MSXML2.ServerXMLHTTP") 
 xmlhttp.open "GET", url, false 
 xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" 
 xmlhttp.setRequestHeader "Accept-Language", "en-us" 
 xmlhttp.send "x=hello" 
 status = xmlhttp.status 
    if err.number <> 0 or status <> 200 then 
        if status = 404 then 
            Response.Write "[EFERROR]Page does not exist (404)." 
        elseif status >= 401 and status < 402 then 
            Response.Write "[EFERROR]Access denied (401)." 
        elseif status >= 500 and status <= 600 then 
            Response.Write "[EFERROR]500 Internal Server Error on remote site." 
        else 
            Response.write "[EFERROR]Server is down or does not exist." 
        end if 
    else  
 data =  xmlhttp.responseText 

Мне в основном нужно, чтобы получить содержание <title>Here is the title</title> также мета-описание, ключевые слова и некоторые выбранные метаданные открытого графика.

И, наконец, мне нужно получить содержание первого <h1>Heading</h1> а также <p>Paragraph</p>

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

3 ответа

Вы можете использовать свойство.responseXML для извлечения нужного контента без использования регулярных выражений. Потому что вы ищете данные внутри <title>, <h1> а также <p> теги, возвращаемый документ, вероятно, HTML. Если документ HTML правильно сформирован в соответствии со спецификациями XML, это может означать, что он уже автоматически проанализирован и доступен после получения ответа.

Так что вы можете попробовать это:

Dim objData
Set objData = xmlhttp.responseXML.selectSingleNode("//*[local-name() = 'title']")

If objData Is Nothing Then
    Response.Write "# no result #<br />"
Else
    Response.Write "title: " & objData.Text & "<br />"
End If

Обратите внимание, что это выражение XPath может быть не самым эффективным способом запроса XML-документа (в случае, если вы хотите обработать большие объемы данных).

Я фактически использовал это решение в конце, так как оно также решает проблему наличия имен классов в коде.

Function GetFirstMatch(PatternToMatch, StringToSearch)
    Dim regEx, CurrentMatch, CurrentMatches

    Set regEx = New RegExp
    regEx.Pattern = PatternToMatch
    regEx.IgnoreCase = True
    regEx.Global = True
    regEx.MultiLine = True
    Set CurrentMatches = regEx.Execute(StringToSearch)

    GetFirstMatch = ""
    If CurrentMatches.Count >= 1 Then
        Set CurrentMatch = CurrentMatches(0)
        If CurrentMatch.SubMatches.Count >= 1 Then
            GetFirstMatch = CurrentMatch.SubMatches(0)
        End If
    End If
    Set regEx = Nothing
End Function

    title = clean_str(GetFirstMatch("<title[^>]*>([^<]+)</title>",data))
    firstpara = clean_str(GetFirstMatch("<p[^>]*>([^<]+)</p>",data))
    firsth1 = clean_str(GetFirstMatch("<h1[^>]*>([^<]+)</h1>",data))

Использовать Mid функция в сочетании с Instr функция. Я построил функцию, которая использует Mid Функция определения тега обернутого текста путем нахождения позиции каждого тега с помощью Instr функция:

 Function GetInnerData(Data,TagOpen,TagClose)
   OpenPos = Instr(1,data,TagOpen,1)
   ClosePos = Instr(1,data,TagClose,1)
   If OpenPos > 0 And ClosePos > 0 Then GetInnerData = Trim(Mid(data,OpenPos+Len(TagOpen),ClosePos-(OpenPos+Len(TagOpen))))
 End Function

Когда вы запустите эту функцию, она вернется My Title

<%=GetInnerData("any text <title>My Title</title> any text","<title>","</title>")%>

И в вашем случае, вы бы сделали это так:

 TitleData = GetInnerData(data,"<title>","</title>")

Это получит контент в вашем <title> тег. или же

 H1Data = GetInnerData(data,"<h1>","</h1>")

Это получит контент в вашем <h1> тег.

Instr Функция возвращает первую найденную строку в данных, поэтому эта функция будет делать именно то, что вам нужно.

Другие вопросы по тегам