用一个正则表达式获取特定div中的几个链接

时间:2012-05-09 14:29:40

标签: php regex

看一下这个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或其他解析器。

1 个答案:

答案 0 :(得分:-1)

请勿将REGEX用于PARSE 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时。