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.ini 中的正则表达式在 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);
        }
    }
}
?>

这将输出任何 div 类为“foo”的所有匹配链接。

不应该使用正则表达式来解析 HTML,因为 HTML 本身不是常规语言。它可能会变得非常草率,并且您最终可能会遇到比开始时更多的问题,尤其是当您可能正在处理格式错误的 HTML 时。

于 2012-05-09T19:39:29.657 回答