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

Posted

技术标签:

【中文标题】使用 PHP 和 XPath 获取匹配正则表达式的 href【英文标题】:Get hrefs that match regex expression using PHP & XPath 【发布时间】:2016-06-02 15:13:18 【问题描述】:

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

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

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

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

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

谢谢

【问题讨论】:

【参考方案1】:

XPath 1.0 是 DOMXPath() 支持的版本,没有 Regex 功能。不过,如果需要,您可以轻松编写自己的 php 函数来执行从 DOMXPath 调用的正则表达式,如 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 example 从 DOMXPath::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";

【讨论】:

1+;太糟糕了 //a[matches(@href, '^/\d+$')] 不支持。 完美答案。谢谢你。 PHP 不支持 Xpath2.0 吗? @fractal5 不是核心 PHP。我不经常使用 PHP,也许有一个库提供 XPath 2.0 支持,不确定。您最好的选择可能是调用 PHP 函数,如 preg_match 或您自己的 PHP 函数。 UPDATE 部分中提供的示例。

以上是关于使用 PHP 和 XPath 获取匹配正则表达式的 href的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式、xpath、BeautifulSoup和JSONPath的区别?

Python Xpath的解析,应用

如何通过移动 xpath 与 Appium 匹配 @text 属性和正则表达式(正则表达式)来查找元素?

使用 XPath 和正则表达式提取 HTML 注释中的文本

有没有办法仅使用 XPATH 1.0 将多个相同命名的属性与正则表达式字符串匹配?

使用xpath爬取猫眼电影排行榜