在 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;
}
}
我正在寻找一种正确的语法来匹配 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;
}
}