使用 PHP & XPath 获取与正则表达式匹配的 href

Get hrefs that match regex expression using PHP & XPath

我有一个包含多个超链接的页面。我想得到的格式是:

<html>
<body>

<div id="diva">
<a href="/123" >text2</a>
</div>

<div id="divb">
<a href="/345" >text1</a>
<a href="/678" >text2</a>
</div>

</body>
</html>

我想提取三个 hrefs 123,345 和 678。

我知道如何使用 $gm = $xpath->query("//a") 获取所有超链接,然后遍历它们以获取 href 属性。

是否有某种正则表达式来获取仅具有上述格式的属性(即“/digits”)?

谢谢

XPath 1.0,即 DOMXPath() 支持的版本,没有正则表达式功能。但是,如果需要,您可以轻松编写自己的 PHP 函数来执行要从 DOMXPath 调用的 Regex 表达式,如 this other answer.

中所述

test if an attribute value is a number 有 XPath 1.0 方法,您可以在 / 字符后的 href 属性值上使用它来测试属性值是否遵循模式 /digits :

//a[number(substring-after(@href,'/')) = substring-after(@href,'/')]

更新:

为了完整起见,这里 a working exampleDOMXPath::query() 调用 PHP 函数 preg_match 来完成相同的任务:

$raw_data = <<<XML
<html>
<body>

<div id="diva">
<a href="/123" >text2</a>
</div>

<div id="divb">
<a href="/345" >text1</a>
<a href="/678" >text2</a>
</div>

</body>
</html>
XML;
$doc = new DOMDocument;
$doc->loadXML($raw_data);

$xpath = new DOMXPath($doc);

$xpath->registerNamespace("php", "http://php.net/xpath");
$xpath->registerPHPFunctions("preg_match");

// php:function's parameters below are :
// parameter 1: PHP function name
// parameter 2: PHP function's 1st parameter, the pattern
// parameter 3: PHP function's 2nd parameter, the string
$gm = $xpath->query("//a[php:function('preg_match', '~^/\d+$~', string(@href))]");

foreach ($gm as $a) {
    echo $a->getAttribute("href") . "\n";
}