2010-01-14 4 views

답변

1

, 나는 생각 . 다른 사람들이 말했듯이 HTML을 제어하지 못하는 경우 정규식을 사용하는 것이 좋지 않습니다.

3

"HTML에서 물건을 추출하는 방법"질문은 정규식을 사용하는 것이 아닙니다. 대신 Robust, Mature HTML Parser for PHP에 대한 토론을 참조하십시오.

+0

예를 들면? 'article'div 클래스 안에 모든 제목 태그를 가져와야합니다. 항상 DOm에 대해 혼란 스러워요 – bluedaniel

2

는 당신이 HTML 파서를 사용하여 아마 더 좋을 것 같아 뭔가 SimpleHTMLDOM parser

+0

나는이 점에서 regexp가 더 나은 것으로 나타났습니다. DOM 파서는 HTML 또는 잘못된 HTML 구조가 깨진 웹 페이지에서는 다소 신뢰할 수 없습니다. –

2

을이 작업에 대한 정규식을 사용하고 사용하지 않는 것이 좋습니다. 하지만 실제로는 단순한 시나리오, 이런 일을 할 수 있습니다

preg_match_all('/<h[0-6]>([^</h[0-6]>*)</h/i', $string, $matches); 

만큼 헤더 태그가 중첩되지 않는 한 작동합니다 : 당신은 실제로 정규 표현식을 사용하려면

if (preg_match_all('/<h\d>([^<]*)<\/h\d>/iU', $str, $matches)) { 
    // $matches contains all instances of h1-h6 
} 
+0

PHP 5.3.5에서이 스 니펫을 사용할 때'preg_match_all() : 알 수없는 수정 자 'h'가 있습니다. 그 오류를 해결하기 위해 파이프 기호로 정규 표현식 경계를 대체했습니다 :' '| ([^ <]*)는 | iU''이 스크립트에 대한 깨진 – feeela

3

또한 DOMDocument PHP 클래스를 고려하십시오.

$domdoc->getElementsByTagName('h1')을 사용하여 표제를 가져올 수 있습니다.

5

먼저 당신은 깔끔한로 (예제에서 $ html_str) HTML을 정리해야합니다

$tidy_config = array(
    "indent"    => true, 
    "output-xml"   => true, 
    "output-xhtml"   => false, 
    "drop-empty-paras"  => false, 
    "hide-comments"  => true, 
    "numeric-entities"  => true, 
    "doctype"    => "omit", 
    "char-encoding"  => "utf8", 
    "repeated-attributes" => "keep-last" 
); 

$xml_str = tidy_repair_string($html_str, $tidy_config); 

그런 다음 당신이있는 DOMDocument로 XML ($ xml_str를)로드 할 수

$doc = DOMDocument::loadXML($xml_str); 

그리고 마지막으로 당신은 Horia 드라고 미르의 방법을 사용할 수 있습니다

$list = $doc->getElementsByTagName("h1"); 
for ($i = 0; $i < $list->length; $i++) { 
    print($list->item($i)->nodeValue . "<br/>\n"); 
} 

을 또는 당신은 또한 더 복잡한 쿼리에 대한 XPath를 사용할 수 있습니다 있는 DOMDocument에 그러나 내가 공동으로 제목 태그를 잡을 수 있었다 최선의 방법을 언급하고 싶었, 나는이 슈퍼 이전 게시물 알고

$xpath = new DOMXPath($doc); 
$list = $xpath->evaluate("//h1"); 
+0

뭔가, 같은 간단한 HTML과 시도 '

테스트


' – bluedaniel

+0

당신은 어떻게해야합니까 어떤 오류 나는 예를하려고하면 예상대로 작동 제공? 및 인쇄 "테스트"유일한 변경 존재와 위의 모든 코드에서와 같이 – CodeAddict

+0

: $는 xml_str = tidy_repair_string ('는

테스트


', $의 tidy_config) ??? 그것은 내 스크립트를 나누기,이있다 오류가 오타 또는 무언가처럼 충돌하고있다 – bluedaniel

3

(http://www.php.net/manual/en/class.domxpath.php 참조).

이 방법은
<h1>title</h1> and <h2>title 2</h2> 

(정규식로 작동은하지만 PHP는 약간 다르게 작동한다.) 귀하는 preg_match에서

/<\s*h[1-2](?:.*)>(.*)</\s*h/i 

사용이

|<\s*h[1-2](?:.*)>(.*)</\s*h|Ui 

$group[1] 지금까지 무엇을 포함 할 것이다 heading 태그 사이. $group[0]이이 공간을 차지합니다 모든 <h1>test</h

이며, 누군가가 "클래스/ID가"

<h1 class="classname">test</h1> 

클래스/ID (그룹)를 추가하는 경우 무시됩니다.

: HTML 태그를 분석 할 때 필자는 항상 흰 공백, 줄 바꿈, 탭 등을 1 개의 공백으로 제거하고 바꿉니다. 이것은 멀티 라인, 닷올 (dotsall)을 최소화합니다 ... 그리고 매우 큰 양의 공백 (white space)은 어떤 경우에는 정규 표현식으로 엉망이 될 수 있습니다.

  • 당연히 1-2 표제 태그 만 잡아서 모두를 잡으려고 0-9로 변경하십시오.
  • 다른 사람이 내 코드에 추가하거나 수정해야하는 사람이 있으면 답장하십시오. 알고 싶습니다.
  • 반대로 Regex가 HTML에 좋지 않다는 것은 매우 열린 주장입니다. PHP 함수를 디자인하고 정규식을 사용하여 정크를 완벽하게 제거하고 regex 특정 표현식에 대해 html을 준비 할 수 있기 때문에 원하는 내용을 완벽하게 얻을 수 있습니다. 당신은 아마추어 html 작업을 대체 할 수있는 충분한 정규식 함수를 만들 수 있습니다. 여기

regex test

+0

나는 당신이 전체 요소를 움켜 잡지 못하고 닫는 태그를 자르지 않을 것임을 의미한다고 생각한다.> 또한 (| *. *)> (. *) | Ui' 표제에 줄 바꿈 문자 ('
')가 있으면 사용자 생성 콘텐츠로 작업하는 경우 완전히 가능합니다. – cameronjonesweb

0

난 그냥 내 솔루션을 공유 할 테스트 페이지에 대한 링크입니다 :

function get_all_headings($content) { 
    preg_match_all('/\<(h[1-6])\>(.*)<\/h[1-6]>/i', $content, $matches); 

    $r = array(); 
    if(!empty($matches[1]) && !empty($matches[2])){ 
     $tags = $matches[1]; 
     $titles = $matches[2]; 
     foreach ($tags as $i => $tag) { 
      $r[] = array('tag' => $tag, 'title' => $titles[ $i ]); 
     } 
    } 

    return $r; 
} 

제목이 발견되거나이 같은되지 않은 경우는 하늘의 배열을 반환합니다이 기능 :

array (
    array (
     'tag' => 'h1', 
     'title' => 'This is a title', 
    ), 
    array (
     'tag' => 'h2', 
     'title' => 'This is the second title', 
    ), 
) 
관련 문제