0

このhtmlを見てください:

<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 やその他のパーサーではなく、正規表現でなければなりません。

4

1 に答える 1

-1

HTMLを解析するために正規表現を使用しないでください。

<?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'のdivの下にあるすべての一致するリンクが出力されます。

HTML自体は正規言語ではないため、正規表現を使用してHTMLを解析しないでください。それは非常にずさんなものになる可能性があり、特に不正な形式のHTMLを処理している可能性がある場合は、最初よりも多くの問題が発生する可能性があります。

于 2012-05-09T19:39:29.657 に答える