Использование регулярных выражений в 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
Функция возвращает первую найденную строку в данных, поэтому эта функция будет делать именно то, что вам нужно.