2011-03-12 4 views
0

구문 분석에 필요한 책 Webbots, Spiders 및 Screen Scrapers의 parse_array 함수를 사용하고 있습니다. 그러나 나는이 기능을 조금 수정해야하며 어떻게해야할지 모르겠다.함수 수정에 도움이 필요합니다 (정규식)

기능은 :

function parse_array($string, $beg_tag, $close_tag) 
    { 
    preg_match_all("($beg_tag(.*)$close_tag)siU", $string, $matching_data); 
    return $matching_data[0]; 
    } 

작동 방식 :이 처리 할 수 ​​있도록

$html="<div> 
      afterfirst 
      <div>nested</div> 
      this is lost 
      </div> 
      <div>div2</div>" ; 

    $div_array = parse_array($html,"<div", "</div>") ; 
    echo $div_array[0]. "</br>" ; 
    //outputs: 
    <div> 
    afterfirst 
    <div>nested</div> 
    //the line "this is lost" and the last </div> isn't included. 

은 기본적으로 기능이 기능을 변경하는 중첩 된 태그

가능한 다룰 수 없다 중첩 태그가있는 경우 즉 다음 닫는 태그에서 멈추는 대신 다른 중첩 된 태그를 추적하고 올바른 닫는 태그 다음에 만 멈춤

도움 말?

감사

편집 : 정규식을 구문 분석 reommended되지 알고, PHP는 DOM과 simplehtmldom하지만,이 구문 분석 배열 기능이 잘 작동이 만이 중첩 된 태그를 처리 할 수 ​​있다면 있다면, 그것은 것 완전한! 그래서이 모든 도움은 크게 감사 할 것입니다. 완전한 해결 방법이 아니라면 일종의 힌트를주세요. 문제에 직면했을 때

+0

자, 이제 정규식을 파싱하기가 어렵습니다. 예를 들어 DOMDocument에서 HTML을로드 할 수 없습니까? 또한 이것이 설교하는 것이라면 책을 보관하십시오. – Wrikken

+1

이것이 정규식을 사용하여 HTML을 구문 분석하지 않는 이유입니다. –

+0

책은 아주 환상적입니다. –

답변

0

어떤 사람들은, "나는, 내가 정규 표현식을 사용합니다 알고있다."생각 이제 그들은 두 가지 문제가 있습니다.

솔루션 :

Simple DOM HTML Parser

+0

'A' 파서를 사용하십시오.이 스크립트는 거의 좋아하지 않습니다. 네이티브 DOMDocument 나 다른 XML 함수들에 비해 매우 느립니다. 약간의 이득이 있습니다 (SDHP를 좋아한다면'DOMDocument'를 래퍼로 작성하십시오). 함수). – Wrikken

1

편집 : 정규식 구문 분석에 대한 reommended되지 알고, PHP는 DOM과 simplehtmldom가 있지만,이 해석 배열이 기능이 잘 작동하고 태그 만 중첩 태그를 처리 할 수 ​​있다면 이 완벽 할 것입니다. 그래서이 에 대한 도움을 주시면 감사하겠습니다. 내게 힌트를주지 않으면 풀 솔루션 하시기 바랍니다.

Regexes는 그런 일을 추적하지 않으며 계산할 수 없습니다. 중첩 된 태그의이 문제는 HTML을 정규식으로 구문 분석하는 것이 권장되지 않는 이유입니다. 파서가 더 효과적 일 수 있지만 훨씬 더 신뢰할 수 있습니다.

정규식 끝 부분에서 U (ungreedy) 플래그를 제거하는 중 하나를 시도해 볼 수 있습니다. 'ungreedy'라는 것은 첫 번째 </div> 태그와 일치한다는 것을 의미합니다. 반면에 기본값 인 'greedy'모드에서는 마지막으로 일치합니다. 귀하의 HTML에 따라 귀하의 특정 상황에 따라 효과가있을 수도 있지만 그렇지 않을 수도 있습니다. 하지만 정규식으로 중첩 된 태그를 구문 분석하는 문제를 해결하지는 못합니다. 작동하지 않으면 대신 파서를 사용해야합니다.

+0

감사합니다. U 제거를 시도했지만 너무 많이 일치합니다. domdocument를 사용해야 할 것 같아요 ... –

관련 문제