You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PHP DomXPath获取p标签内非子标签包裹的纯文本

如何用PHP DomXPath获取包含文本节点在内的所有子节点?

问题场景

给定以下HTML代码:

<p> 
  Example Text 1
  <span> Text </span>
  Example Text 2
  <img src="example.png">
</p>

原本使用$subObjects = $xpath->evaluate("*", $object);只能获取<p>标签内的元素子节点(<span>和<img>),现在需要按顺序获取包括“Example Text 1”、“Example Text 2”在内的所有子节点。

解决方案

方法1:先获取所有节点再过滤空白文本

XPath的node()表达式可以匹配所有类型的节点(文本、元素、注释等),但会包含换行、空格这类空白文本节点,因此需要手动过滤:

// 获取<p>下的所有子节点
$allNodes = $xpath->evaluate("node()", $object);

// 过滤空白文本节点,保留有效内容
$filteredNodes = [];
foreach ($allNodes as $node) {
    if ($node instanceof DOMText) {
        $trimmedValue = trim($node->nodeValue);
        if (!empty($trimmedValue)) {
            $filteredNodes[] = $node;
        }
    } else {
        $filteredNodes[] = $node;
    }
}

方法2:用XPath表达式直接筛选有效节点

通过XPath的逻辑或(|)合并两种节点:非空白文本节点和所有元素节点,同时保持原始顺序:

// 直接获取非空白文本节点 + 所有元素节点,按文档顺序排列
$allNodes = $xpath->evaluate("text()[normalize-space() != ''] | *", $object);

这里text()[normalize-space() != '']会筛选出内容非空白的文本节点,*匹配所有元素节点,XPath会自动维持节点在原HTML中的顺序。

内容的提问来源于stack exchange,提问作者erena

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:54:24