在PHP中使用带xpath的正则表达式

在PHP中使用带xpath的正则表达式,php,xml,xpath,Php,Xml,Xpath,我试图使用xpath获取与特定模式匹配的xml节点值—任何具有YYYY/MM/DD模式的内容。在下面的示例中,我只想找到第二项。我尝试过将fn:matches和php:functionString与preg_match一起使用,但没有效果 <sometag> <link>site:www.mysite.com/2014/</link> </sometag> <sometag> <link>site:www.mysit

我试图使用xpath获取与特定模式匹配的xml节点值—任何具有YYYY/MM/DD模式的内容。在下面的示例中,我只想找到第二项。我尝试过将fn:matches和php:functionString与preg_match一起使用,但没有效果

<sometag>
  <link>site:www.mysite.com/2014/</link>
</sometag>
<sometag>
  <link>site:www.mysite.com/2014/01/07</link>
</sometag>
我试着用fn:matches搜索2013年,但这也没用

$results = $xml->xpath("//link[fn:matches('2013')]");

我做错了什么?

我相信您希望根据preg\u match的返回值过滤DOMNodeList。下面是一种方法:

    $xpath = new DOMXpath($doc);
    $xpath->registerNamespace('php', 'http://php.net/xpath');
    $xpath->registerPhpFunctions();

    $list = $xpath->query("//sometag[1 = php:function('preg_match',
                '/07/', string(link))]");

    foreach ($list as $node) {
        echo $node->nodeValue;
    }
在上面截图中,$doc指的是DOMDocument的一个实例

我使用的事实是,如果找到匹配项,preg_match将返回1,如果没有,则返回0

注意:此代码段旨在作为起点,而不是最终解决方案。

请记住,DOMPATH仅支持XPath 1.0,第二次尝试时,可以使用contains而不是MATCHS
    $xpath = new DOMXpath($doc);
    $xpath->registerNamespace('php', 'http://php.net/xpath');
    $xpath->registerPhpFunctions();

    $list = $xpath->query("//sometag[1 = php:function('preg_match',
                '/07/', string(link))]");

    foreach ($list as $node) {
        echo $node->nodeValue;
    }