我正在尝试使用PHP捕获HTML中的超链接的所有属性,但我的正则表达式只返回最后一个属性和值。
HTML:
$string = '
<a href="http://www.example.com/" style="font-weight: bold;">Example</a>
<a href="http://www.exampletwo.com/ style="font-weight: bold;">Example Two</a>
';
正则表达式:
preg_match_all('/<a(?: (.*?)="(.*?)")*>(.*?)<\/a>/i', $string, $result);
结果:
Array
(
[0] => Array
(
[0] => <a href="http://www.example.com/" style="font-weight: bold;">Example</a>
[1] => <a href="http://www.exampletwo.com/" style="font-weight: bold;">Example Two</a>
)
[1] => Array
(
[0] => style
[1] => style
)
[2] => Array
(
[0] => font-weight: bold;
[1] => font-weight: bold;
)
[3] => Array
(
[0] => Example
[1] => Example Two
)
)
如何从重复模式返回所有结果?
答案 0 :(得分:3)
如果我可以提供经常被辱骂的'正则表达式HTML解析'的替代方法:
<?php
$string = '
<a href="http://www.example.com/" style="font-weight: bold;">Example</a>
<a href="http://www.exampletwo.com/" style="font-weight: bold;">Example Two</a>
';
$dom = new DOMDocument;
$dom->loadHTML($string);
$as = $dom->getElementsByTagName('a');
foreach ($as as $a) {
echo $a->nodeValue, '<br>';
foreach ($a->attributes as $at) {
echo $at->nodeName, ' ', $at->nodeValue, '<br>';
}
echo '<br><br>';
}
?>
使用DOMDocument来解析HTML,然后简单地告诉它为您提供所有锚标记。但是,如果您怀疑自己将要处理大量的HTML输入,那么总是XMLReader
,尽管您在使用非正确或非XHTML输入时会遇到问题。