代码之家  ›  专栏  ›  技术社区  ›  Astro-Otter

在DOMXpath中使用preg_match来匹配文本contgent

  •  1
  • Astro-Otter  · 技术社区  · 2 年前

    我正在寻找匹配特定模式的正确语法 #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()

    我相信问题出在查询语法上。但是我不知道如何写出正确的语法。

    1 回复  |  直到 2 年前
        1
  •  1
  •   user3783243    2 年前

    我不知道如何实施这个计划 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