PHP XPath Child Concat和新行问题

时间:2015-04-25 21:09:10

标签: php dom xpath

我正在使用DOMXPath来查询HTML文档中的节点,我想要提取哪些内容。

我有以下HTML文档:

<p class="data">
    Immediate Text
    <br>
    Text In Second Line
    <br>
    E-Mail:
    <script>Some Script Tag</script>
    <a href="#">
        <script>Another Script Tag</script>
        Some Link In Third Line
    </a>
    <br>
    Text In Last Line
</p>

我希望收到以下结果:

  

立即文本\ r \ n文本在第二行\ r \ nE-Mail:第三行中的某些链接\ r \ n文本在最后一行

到目前为止,我有以下PHP代码:

#...
libxml_use_internal_errors(true);
$dom = new \DOMDocument();
if(!$dom->loadHTML($html)) {
    #...
}

$xpath = \DOMXPath($dom);
$result = $xpath->query("(//p[@class='data'])[1]/text()[not(parent::script)]");

问题:

  • 它不包括子节点&#39;文本。
  • 不包括换行符。

1 个答案:

答案 0 :(得分:0)

通过在/中使用子轴/text(),您将只获得当前节点上下文的直接子节点。要获取所有后代,请改为使用后代轴(//)。

要同时获取文本节点和<br>,您可以尝试使用//nodes()轴并进一步按节点的类型进行过滤 - 以获取文本节点类型的节点 - 或 name - 获取名为br的元素 - :

(//p[@class='data'])[1]//nodes()[self::text() or self:br][not(parent::script)]