1

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
        )
)

繰り返しパターンからすべての結果を返すにはどうすればよいですか?

4

1 に答える 1

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入力で問題が発生します。

于 2012-07-19T13:27:22.090 に答える