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