如何使用 href url、数据属性和文本组来预匹配整个 <a> 标签

问题描述 投票:0回答:1

在给定的 html 内容中,我需要 preg_match_all

<a>
标签与 href url、文本和数据名称属性组。 我将分享我卡住的当前工作场所。有人可以帮我吗?

HTML 内容:

<a data-name="something" href="google.ru">test</a>
<a href="http://link.com">text2</a>
<a class="external" href="https://example.com">text 4</a>
<a href='sterium.com'>text 66</a><a href="sterium.com" data-name="">aaa</a>

期望的输出:

$match[0]= '<a data-name="something" href="google.ru">test</a>';
$match[0][0] = 'google.ru';
$match[0][1] = 'test';
$match[0][2] = 'something';
$match[1]= '<a href="http://link.com">text2</a>';
$match[1][0] = 'http://link.com';
$match[1][1] = 'text2';
$match[2]= '<a class="external" href="https://example.com">text 4</a>';
$match[2][0] = 'https://example.com';
$match[2][1] = 'text 4';
$match[3]= '<a href=\'sterium.com\'>text 66</a>';
$match[3][0] = 'sterium.com';
$match[3][1] = 'text 66';
$match[4]= '<a href="sterium.com" data-name="">aaa</a>';
$match[4][0] = 'sterium.com';
$match[4][1] = 'aaa';
$match[4][2] = '';
regex preg-match-all
1个回答
0
投票

不要使用正则表达式来解析 HTML。相反,使用内置的

DOMDocument
类,它更健壮。将字符串加载到
DOMDocument
中后,您可以搜索所有
a
标签,然后提取它们的
nodeValue
href
data-name
属性:

$doc = new DOMDocument();
$doc->loadhtml($str);
$anchors = $doc->getElementsByTagName('a');
$matches = [];
foreach ($anchors as $a) {
    $matches[] = array($a->nodeValue, $a->attributes->getNamedItem('href')->nodeValue, $a->attributes->getNamedItem('data-name')?->nodeValue ?? '');
}

输出(用于您的示例数据):

Array
(
    [0] => Array
        (
            [0] => test
            [1] => google.ru
            [2] => something
        )
    [1] => Array
        (
            [0] => text2
            [1] => http://link.com
            [2] => 
        )
    [2] => Array
        (
            [0] => text 4
            [1] => https://example.com
            [2] => 
        )
    [3] => Array
        (
            [0] => text 66
            [1] => sterium.com
            [2] => 
        )
    [4] => Array
        (
            [0] => aaa
            [1] => sterium.com
            [2] => 
        )
)

3v4l.org 上的演示

© www.soinside.com 2019 - 2024. All rights reserved.