2012-05-09 20 views
0

と特定のdiv内のいくつかのリンクは、このHTMLを見てみましょう取得:1つの正規表現

<div class="foo"><a href="link1">link1</a><a href="link2">link2</a></div> 
<div class="bar"><a href="barlink">barlink</a></div> 

私は、PHP内の正規表現とfooの内部のすべてのリンクでループをできるかどうかを知りたいと思います。 は、私はこれを試みたが、動作していない:

preg_match_all(
    '#<div.*?class="foo".*?<a.*?>(?P<text>.*?)</a>#xi', 
    $text, 
    $matches, 
    PREG_SET_ORDER 
); 

悲しいことに、この場合には、それがないXMLまたは他のパーサー、正規表現でなければなりません。

+0

'(?P 。*?)'で何をしようとしていますか?クラス "foo"のdiv内のすべてのリンクテキストを取得しようとしていますか? –

+0

はい。 ?P はパラメータの名前を付けるだけです。 – Jonathan

答えて

-1

PARSE HTMLにはREGEXを使用しないでください。

<?php 
$content = 
'<div class="foo"> 
<a href="link1">link1</a> 
<a href="link2">link2</a> 
</div> 
<div class="bar"> 
<a href="barlink">barlink</a> 
</div>'; 

$dom = new DOMDocument(); 
$dom->loadHTML($content); 
$divs = $dom->getElementsByTagName('div'); 
foreach($divs as $div) 
{ 
    $classes = explode(' ', $div->getAttribute('class')); 
    if(in_array('foo', $classes) || trim($div->getAttribute('class')) === 'foo') 
    { 
     foreach($div->getElementsByTagName('a') as $link) 
     { 
      echo $dom->saveXML($link); 
     } 
    } 
} 
?> 

これは、すべての一致するリンクをクラス 'foo'で出力します。

HTML自体は正規の言語ではないため、正規表現を使用してHTMLを解析するべきではありません。それは非常にお粗末になることがあります。特に、誤った形式のHTMLを扱っている可能性がある場合には、始めたものよりも多くの問題が発生する可能性があります。

+1

@downvoters正しい仕事のために正しいツールを使用することの重要性を強調する回答を申し訳ありません(http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-含まれたタグ/ 1732454#1732454)。次回は、HTMLパーサーでHTMLを解析したくない場合は、すべてを削除して[jQuery](http://meta.stackexchange.com/questions/19478/the-many-memes-of-メタ#19492) – maiorano84