在 DOMXpath 中使用 preg_match 来匹配文本内容

Using preg_match in DOMXpath for mathing text contgent

我正在寻找一种正确的语法来匹配 DOMDocument 文本内容中的特定模式 #some_string#

$document = <<<XML
<div>
    <para>text not to match</para>
    <para>Other line #my_pattern_to_match#, hello world</para>
    <block>
        <para>Second test #other_pattern_to_match# in a sub child node</para>
    </block> 
</div>
XML;

$xpath = new DOMXPath($document);

$xpath->registerNamespace("php", "http://php.net/xpath");
$xpath->registerPHPFunctions('preg_match');

$nodes = $xpath->query('//*[text()][0 < php:functionString("preg_match", "/\#(.*?)#/")]');

我的结果是: preg_match() expects at least 2 parameters, 1 given

有:

$nodes = $xpath->query('//para/text()[0 < php:functionString("preg_match", "/\#(.*?)#/")]');

一个空的DOMNodeList()

我确定这是查询语法的问题。但是我不知道如何写出正确的语法。

我不知道如何将 preg_match 实现到 xpath 查询中,但您也可以只提取所有 para 元素和 运行 它们上的正则表达式。

$document = <<<XML
<div>
    <para>text not to match</para>
    <para>Other line #my_pattern_to_match#, hello world</para>
    <block>
        <para>Second test #other_pattern_to_match# in a sub child node</para>
    </block> 
</div>
XML;
$dom = new DOMDocument;
$dom->loadXML($document);
$paras = $dom->getElementsByTagName('para');
foreach($paras as $para){
    if(preg_match('/#(.*?)#/', $para->nodeValue, $match)){
        echo $match[1] . PHP_EOL;
    }
}

https://3v4l.org/imChg