2010-01-09 8 views
0

HTML 파일에서 링크 텍스트를 검색하려고합니다. 각 링크에는 특정 클래스가 적용되지만 URL은 다릅니다. 내가 원하는 것보다 나는 다음과 같은 PHP 코드를 사용하고A 태그 사이의 텍스트 검색

... 
<a class="fetch-me" href="products/1">Find ME!!!</a> 
... 
<a class="fetch-me" href="products/2">Me too!</a> 
... 

하지만 항상 더 받고 :

나는 다음이

preg_match_all('<a class="fetch-me" href=".*">(.*)</a>)siU', $string, $matching_data); 
+4

html을 정규식으로 구문 분석하지 마십시오. 네가 그렇게한다면, 척 노리스가 너를 사냥 할거야! http://stackoverflow.com/questions/590747/using-regular-expressions-to-parse-html-why-not – johnnyArt

+1

스택 오버플로에 대한 다른 정규 표현식 질문과 중복되지 않습니까? –

+3

예. 그리고 누군가가 그것을해야하기 때문에 : http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –

답변

3
<?php 

$str = ' 
<a class="fetch-me" href="products/1">Find ME!!!</a> 
... 
<a class="fetch-me" href="products/2">Me too!</a> 
'; 

$doc = new DOMDocument(); 
$doc->loadHTML($str); 
$xp = new DOMXpath($doc); 
$query = $xp->evaluate('//a[@class="fetch-me"]'); 

if ($query->length > 0) { 
    foreach ($query as $anchor) { 
    echo $anchor->nodeValue . '<br>'; 
    } 
} 

당신은 또한 당신은 항상뿐만 아니라 DOM에 대한 추상화 된 높은 수준의 래퍼를 사용할 수 @class와 함께 @contains를 사용할 수 있습니다.

+1

답변입니다.내 대답 (정규 표현식을 사용하지 않는 부분을 제외하고)을 무시하고 이것을 사용하십시오. PHP를 모르므로 HTML 구문 분석기와 XPath 라이브러리를 머리 위로 쓰는 방법에 대한 예제를 작성할 수는 없지만 모든 언어에서 이미 HTML 또는 XML 구문 분석기를 사용하는 것이 좋습니다. 귀하의 언어로 존재합니다. –

0

무엇과 같이 약 :

/<a[^>]*([^<]*)<\/a>/siU 
0

정규 표현식을 사용해야하는 경우 .* 대신 .*?을 사용하십시오. *?non-greedy 버전이며 *입니다. 즉 가능한 한 많이 매칭하는 것이 아니라 가능한 한 일치시킵니다.

(그건 그렇고, don't try matching HTML or XML with regular expressions는, 그 방법은 madness있다 대신, HTML 또는 XML 파서를 사용해보십시오 당신이하는 HTML 파서가 HTML Tidy을 통해 그것을 실행하고 XML 파서를 사용하지 않는 경우 방법은 meder's answer를 참조하십시오... PHP에서는이 작업을 수행 할 수 있습니다.). 모두가 다른 말했듯이

+1

나는 정규식이 작고 특정한 것을 좋아한다고 말할 것이다. 작업 (아무 것도 실제로 잘못 될 수없는 곳). 그러나 나는 아마 이것을 말하면서 죽을 것이다. –

+2

분명히, 뭔가 잘못 될 수 있습니다. 정규 표현식을 작동시키는 데 문제가 있습니다. 너무 많은 입력을 소비합니다. 그리고 그가 그것을 고치더라도, 그가 설명하지 않은 여분의 공백이나 다른 순서의 인자 또는 다른 많은 문제가있는 태그가있을 것입니다. 정규 표현식을 모두 고쳐야 할 때, 실제 파서를 통해 입력을 실행하고 XPath 표현식 'a [@ class = "fetch-me"]를 사용하여 요소를 선택하는 것이 훨씬 쉽습니다. '또는 CSS 쿼리'a.fetch-me' (HTML 또는 XML 파서 라이브러리가 지원하는 방식에 따라 다름) –

+1

HTML 및 XML 구문 분석은 해결 된 문제입니다. 라이브러리가 작성되었습니다. 왜 바퀴를 심하게 재발 명합니까? 이미 존재하는 라이브러리 만 사용하십시오! http://docs.php.net/manual/en/class.domxpath.php –

0

하나의 방법

$ php test.php 
--> Find ME!!! 
--> Me too! 
--> Find me, i am at next line!!! 

이상적으로

$str= <<<A 
blah blah 
blah 
... 
<a class="fetch-me" href="products/1">Find ME!!!</a> 
<a class="fetch-me" href="products/2">Me too!</a> 
blah 
blah 
<a class="fetch-me" 
      href="products/1">Find me, i am at next line!!!</a> blah blah 
A; 
$s = explode("</a>",$str); 
foreach ($s as $k){ 
    if (strpos($k,"href") !==FALSE){ 
     print "--> ". preg_replace("/^.*href=\".*\">|\">.*/sm","",$k)."\n"; 
    } 
} 

출력, 당신은 실제 파서를 사용합니다. 여러 수준의 값이 문제가있는 경우

0

나는이 모든 답변을 시도했으며 모든 사람들이 옳을 것입니다. 나는 HTML Tidy와 실제 파서를 사용하기 위해 리팩토링을 할 것이다.

제안 해 주셔서 감사합니다.

관련 문제