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

时间:2014-11-19 19:50:39

标签: 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.mysite.com/2014/01/07</link>
</sometag>

我以为我在这里走在正确的轨道上,但令人惊讶的是,它没有用。

$regex = '~(0[1-9]|1[012])[- /.](19|20)\d\d[- /.](0[1-9]|[12][0-9]|3[01])~';
$results = $xml->xpath("//link[php:functionString('preg_match', '".$regex."', .)]");

我试过寻找&#34; 2013&#34;使用fn:匹配,这也没有用。

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

我做错了什么?

1 个答案:

答案 0 :(得分:0)

我认为您希望根据DOMNodeList的返回值过滤preg_match。这是一种方法:

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

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