代码之家  ›  专栏  ›  技术社区  ›  KJW

xpath:选择中断标记前后的文本节点

  •  2
  • KJW  · 技术社区  · 14 年前

    考虑以下因素: <br> <br/> )

    text1
    <br>
    text2
    <br/>
    text3
    <br/>
    text4
    <br>
    text5
    

    如何定位每个文本节点?

    我在想一些符合前面或后面br标记条件的东西……但不确定是否 <br> <br/> 在xpath中被区别对待。

    2 回复  |  直到 14 年前
        1
  •  5
  •   István Ujj-Mészáros    14 年前

    DOMDocument 加载HTML() 方法可以很好地处理无效的HTML片段,因此您可以这样使用DOMXPath:

    <?php
    
    $html = 'text1
    <br>
    text2
    <br/>
    text3
    <br/>
    text4
    <br>
    text5';
    
    echo "<pre>" . htmlentities($html) . "</pre><br>\n";
    
    $dom = new DOMDocument();
    // loadHtml() needs mb_convert_encoding() to work well with UTF-8 encoding
    $dom->loadHtml(mb_convert_encoding($html, 'HTML-ENTITIES', "UTF-8"));
    
    $xpath = new DOMXPath($dom);
    
    echo "Text nodes preceding br:";
    foreach($xpath->query('//text()[(following::br)]') as $node)
    {
        var_dump($node->wholeText);
    }
    
    echo "Text nodes following br:";
    foreach($xpath->query('//text()[(preceding::br)]') as $node)
    {
        var_dump($node->wholeText);
    }
    
    echo "Text nodes following OR preceding br:";
    foreach($xpath->query('//text()[(following::br) or (preceding::br)]') as $node)
    {
        var_dump($node->wholeText);
    }
    
        2
  •  0
  •   MrJoel    14 年前

    您的示例不是可以对其运行XPath查询的有效XML
    元素总是关闭的。

    但是,通常要选择使用节点类型谓词,如//br/text()