2012-05-28 3 views
0

일부 원격 콘텐츠를로드 중이므로 regex를 사용하여 일부 태그의 내용을 격리해야합니다.기본 ASP에서 regex를 사용하여 특정 요소의 내용을 가져옴

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 데이터를 분석 할 수 있습니까? 정규식을 사용해야합니까?

+1

xml 파서 대신 사용 하시겠습니까? –

+0

반환 된 내용을 XML로 구체화하고 노드 선택을 사용할 수 있습니까? 그게 어떻게 효과가 있을지 자세히 설명해 주시겠습니까? 감사합니다 @ DanielA.White –

답변

0

Instr 기능과 결합 된 Mid 기능을 사용하십시오. 나는 Instr 기능을 사용하여 각 태그의 위치를 ​​찾아 태그 랩 텍스트를 결정하기 위해 Mid 함수를 사용하는 기능을 내장 :이 같은이 기능을 실행하면

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 사양에 따라 올바른 형식이면 응답을 얻은 후 이미 HTML 문서가 자동으로 구문 분석되고 액세스 할 수 있다는 의미 일 수 있습니다.

그래서 당신이 시도 할 수 :

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 문서를 조회 할 수있는 가장 효율적인 방법이 될하지 않을 수 (경우에 당신은 많은 양의 데이터를 처리 할).