如何用DOMDocument获取元素不含子元素的主文本
只获取DOM元素的直接文本内容(忽略子元素)
这个场景我太熟悉了!nodeValue确实会把元素下所有子节点的内容一股脑儿拼出来,包括子元素里的文本。要只拿元素直接包含的文本节点,得从节点类型入手,或者用XPath精准筛选。
方法一:遍历子节点筛选文本节点
先拿到目标元素,然后遍历它的子节点,只保留类型为XML_TEXT_NODE(对应数值3)的节点内容:
// 先获取目标span元素 $spanElement = $g->query('//span')[0]; $mainText = ''; // 遍历所有子节点 foreach ($spanElement->childNodes as $childNode) { // 只处理文本节点 if ($childNode->nodeType === XML_TEXT_NODE) { // 用trim去掉多余的空白字符,按需调整 $mainText .= trim($childNode->nodeValue) . ' '; } } // 清理末尾多余的空格 $mainText = trim($mainText); echo $mainText; // 输出:This is the main
方法二:用XPath直接定位文本子节点
更简洁的方式是用XPath的text()函数,直接选中目标元素下的所有直接文本子节点:
// 直接获取span下的所有文本子节点 $textNodes = $g->query('//span/text()'); $mainText = ''; foreach ($textNodes as $textNode) { $mainText .= trim($textNode->nodeValue) . ' '; } $mainText = trim($mainText); echo $mainText; // 输出:This is the main
补充说明
如果你的元素里有多处直接文本(比如<span>开头<i>子元素</i>结尾</span>),这两种方法都会把所有直接文本节点的内容拼接起来,最终得到“开头 结尾”这样的结果,完全符合需求。
内容的提问来源于stack exchange,提问作者Googlebot
相关产品推荐
相关产品推荐

