2012-05-28 3 views
0

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

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

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

+1

Вы считали, что вместо этого используете синтаксический анализатор xml? –

+0

Могу ли я просто указать возвращаемое содержимое как XML и использовать выбор узла? не могли бы вы рассказать о том, как это может работать? Благодаря @ DanielA.White –

ответ

0

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

0

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

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)) 
1

Вы можете быть в состоянии использовать свойство .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 (в случае, если вы хотите, чтобы обрабатывать большие объемы данных).