使用PHP&获取与regex表达式匹配的hrefs的XPath

时间:2016-02-21 05:06:56

标签: php regex xpath href

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

<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属性。

是否有某种regexp来获取上述格式的属性(.i.e&#34; / digits&#34;)?

由于

1 个答案:

答案 0 :(得分:3)

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

this other answer的XPath 1.0方法,您可以在/字符后的/digits属性值上使用,以测试属性值是否遵循模式//a[number(substring-after(@href,'/')) = substring-after(@href,'/')]

preg_match

更新:

为了完整起见,从DOMXPath::query()调用PHP函数$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"; } test if an attribute value is a number来完成相同的任务:

string path = "/Users/Matt/Desktop/Diary/";
filename = (path + filename + ".txt");