
本文介绍在 PHP 中利用 DOMXPath 的 XPath 表达式,精准获取 HTML 元素内所有子节点——既包含子标签(如 、),也包含直接位于父元素内部的纯文本节点(如 "Example Text 1" 和 "Example Text 2"),实现按文档顺序统一遍历。
本文介绍在 php 中利用 domxpath 的 xpath 表达式,精准获取 html 元素内所有子节点——既包含子标签(如 ``、``),也包含直接位于父元素内部的纯文本节点(如 `"example text 1"` 和 `"example text 2"`),实现按文档顺序统一遍历。
在处理 HTML 结构时,DOM 解析器会将元素内的纯文本(即未被任何标签包裹的字符数据)视为独立的 DOMText 节点,与 DOMElement 节点并列存在于父节点的子节点列表中。默认使用 $xpath->evaluate("*", $object) 仅匹配元素节点(element nodes),因此会遗漏 "Example Text 1" 和 "Example Text 2" 这类位于 标签内但未被子标签包裹的文本内容。
要同时获取子元素和相邻纯文本,需在 XPath 表达式中显式包含 text() 节点测试。正确写法为:
$subObjects = $xpath->evaluate("*|text()", $object);
该表达式含义为:匹配 $object 下的所有子元素节点(*)或所有直接子文本节点(text()),且结果按其在源 HTML 中的出现顺序自然排列(即文档顺序)。执行后,$subObjects 将返回一个 DOMNodeList,其中节点类型混合存在:
-
DOMElement(如、) -
DOMText(如"Example Text 1\n "、" Example Text 2\n ")
✅ 关键注意事项:
-
text()仅匹配直接子文本节点,不递归匹配深层嵌套文本; - 文本节点可能包含空白符(换行、缩进、空格),建议用
trim($node->textContent)或preg_replace('/\s+/', ' ', $node->nodeValue)清理; - 若需区分节点类型,可遍历后判断:
foreach ($subObjects as $node) { if ($node instanceof DOMElement) { echo "Element: tagName . ">\n"; } elseif ($node instanceof DOMText && trim($node->nodeValue) !== '') { echo "Text: \"" . trim($node->nodeValue) . "\"\n"; } }
综上,"*|text()" 是 DOMXPath 中实现“结构化 + 文本流”一体化提取的标准且高效方案,适用于解析富文本段落、提取带内联标记的正文内容等典型场景。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











