2011-11-08 3 views
0

나는 인터넷 검색을 시도했지만 그것에 대해 아무것도 찾을 수 couldnt. 당신은 또한 각 섹션과 그것이 무엇에 대한 세부 패턴을 설명해주십시오 수preg_match_all에 대한 패턴을 만드는 방법

<vboxview leftinset="10" rightinset="0" stretchiness="1"> // CONTENT INSIDE HERE </vboxview> 

와 두 번째 당신은에 지정하는 방법 : 처음에는 기대했다 누군가가 나는 이러한 태그 사이의 정보를 얻을 수있는 패턴을 작성하는 데 도움 수 코드의 특정 부분을 얻으십시오.

+2

XML 구문 분석기를 사용하십시오. Regexex는 XML 또는 HTML 구문 분석 용으로 설계되지 않았습니다. – Cfreak

+0

괜찮 았지만 그 다음 preg_match_all은 무엇을 위해 사용 되었습니까 ?? php.net에서 html을 파싱하는 예제를 실제로 보여주기 때문입니다. –

+2

@AhouraGhotbi - 예, 좋지 않은 예이며 변경해야합니다. 정규식은 패턴이있는 데이터를 구문 분석하기위한 것입니다. 정의에 의한 XML과 HTML은 구조화되어 있지 않습니다. 정규식을 사용하여 구문 분석 할 수 있지만 파일을 특정 방식으로 구성 할 필요가 없으므로 좋은 생각이 아닙니다. 다른 말로하면 누군가가 당신에게 사양에 맞는 XML 파일을 제공하더라도 프로그램이 중단 될 위험이 높습니다. – Cfreak

답변

1

은 SGML 기반 언어 및 정규식 내 호언 장담에 대한 질문에 대한 내 댓글 ... 내 대답에 지금

를 참조하십시오. 문제의 태그 내부에 다른 HTML/XML 요소가되지 않습니다 알고 있다면

, 다음이 아주 잘 작동합니다 : 세분화

<vboxview\s(?P<vboxviewAttributes>(\\>|[^>])*)>(?P<vboxviewContent>(\\<|[^<])*)</vboxview> 

,이 표현은 말한다 :

<vboxview     # match `<vboxview` literally 
\s+      # match at least one whitespace character 
(?P<vboxviewAttributes> # begin capture (into a group named "vboxViewAttributes") 
    (\\>|[^>])*    # any number of (either `\>` or NOT `>`) 
)       # end capture 
>       # match a `>` character 
(?P<vboxviewContent>  # begin capture (into a group named "vboxViewContent") 
    (\\<|[^<])*    # any number of (either `\<` or NOT `<`) 
)       # end capture 
</vboxview>    # match `</vboxview>` literally 

> 문자를 또는 더 나은 HTML/XML 엔터티로

문자로 소스 내부에서 벗어나야합니다. b 내부에 중첩 된 구조체가 있으면 start running into problems with regex으로 이동하거나 이미 정규식을 사용하지 않는 다른 방법을 사용하기로 결정했습니다.

+0

고마워요 :) :) 나는 다른 방법을 찾고 있습니다. 그러나 지금은 좋은 것 같습니다. –

1

주석에서 언급했듯이 정규 표현식으로 HTML에서 항목을 추출하려고 시도하는 것은 좋지 않습니다. 더 방탄 방법으로 전환하고 싶다면 여기 DOMDocument API를 사용하여 쉽게 정보를 추출하는 방법에 대한 간단한 예가 있습니다.

<?php 
function get_vboxview($html) { 

    $output = array(); 

    // Create a new DOM object 
    $doc = new DOMDocument; 

    // load a string in as html 
    $doc->loadHTML($html); 

    // create a new Xpath object to query the document with 
    $xpath = new DOMXPath($doc); 

    // an xpath query that looks for a vboxview node anywhere in the DOM 
    // with an attribute named leftinset set to 10, an attribute named rightinset 
    // set to 0 and an attribute named stretchiness set to 1 
    $query = '//vboxview[@leftinset=10 and @rightinset=0 and @stretchiness=1]'; 

    // query the document 
    $matches = $xpath->query($query); 

    // loop through each matching node 
    // and the textContent to the output 
    foreach ($matches as $m) { 
      $output[] = $m->textContent; 
    } 

    return $output; 
} 
?> 

더 나은 아직 단 하나의 vboxview 귀하의 의견에가있을 보장되는 경우 vboxviewid 속성을 추가하고 짧은 더 일반화에 아래의 코드를 줄일 수 (또한 가정 당신은 HTML의 제어 할 수 있습니다) 기능.

<?php 
function get_node_text($html, $id) { 
    // Create a new DOM object 
    $doc = new DOMDocument; 

    // load a string in as html 
    $doc->loadHTML($html); 

    // return the textContent of the node with the id $id 
    return $doc->getElementById($id)->textContent; 
} 
?>