【问题标题】:Get hrefs that match regex expression using PHP & XPath使用 PHP 和 XPath 获取匹配正则表达式的 href
【发布时间】: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”)?

谢谢

【问题讨论】:

    标签: php regex xpath href


    【解决方案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 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";
    }
    

    【讨论】:

    • 1+;太糟糕了 //a[matches(@href, '^/\d+$')] 不支持。
    • 完美答案。谢谢你。 PHP 不支持 Xpath2.0 吗?
    • @fractal5 不是核心 PHP。我不经常使用 PHP,也许有一个库提供 XPath 2.0 支持,不确定。您最好的选择可能是调用 PHP 函数,如 preg_match 或您自己的 PHP 函数。 UPDATE 部分中提供的示例。
    猜你喜欢
    • 1970-01-01
    • 2010-10-10
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多