PHP正则表达式只返回重复模式的最后一次出现?

PHP正则表达式只返回重复模式的最后一次出现?,php,regex,html,repeat,Php,Regex,Html,Repeat,我试图用PHP捕获HTML中超链接的所有属性,但我的正则表达式只返回最后一个属性和值 HTML: $string='1!' '; 正则表达式: preg_match_all('/<a(?: (.*?)="(.*?)")*>(.*?)<\/a>/i', $string, $result); preg\u match\u all('/ [1] => ) [1] =>阵列 ( [0]=>样式 [1] =>风格 ) [2] =>阵列 ( [0]=>字体大小:粗体; [1]

我试图用PHP捕获HTML中超链接的所有属性,但我的正则表达式只返回最后一个属性和值

HTML:

$string='1!'
';
正则表达式:

preg_match_all('/<a(?: (.*?)="(.*?)")*>(.*?)<\/a>/i', $string, $result);
preg\u match\u all('/
[1] => 
)
[1] =>阵列
(
[0]=>样式
[1] =>风格
)
[2] =>阵列
(
[0]=>字体大小:粗体;
[1] =>字体大小:粗体;
)
[3] =>阵列
(
[0]=>示例
[1] =>示例二
)
)

如何让它返回重复模式的所有结果?

如果我可以提供一种替代经常被人诟病的“正则表达式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输入时会遇到问题。

()仅在您想要提取该值时使用!使用如下方式:重复捕获组仅捕获最后一个匹配。
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
        )
)
<?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>';
    }
?>