如何用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
相关产品推荐
相关产品推荐

