PHP使用Simple HTML DOM提取多层嵌套div中的p标签内容
从嵌套div中提取所有p标签内容的PHP脚本修正方案
我来帮你搞定这个嵌套div里提取p标签内容的问题!先明确你的需求:给定最多15层嵌套的div结构,要把所有p标签的内容提取出来(顺序不限),最终输出Hi Hello Hey。
你之前写的递归思路是对的,但有几个小问题导致代码无法正常工作,我来帮你修正并解释:
原代码的问题点
getElementsByTagName返回的是DOMNodeList对象,不能直接访问innertext,必须遍历每个节点才能获取内容- 判断是否有子div时,不能用
count($internalDiv),DOMNodeList的长度要通过->length属性获取 - 递归时的变量名冲突:
foreach ($internalDiv as $div)里的$div覆盖了函数参数的$div,会导致逻辑错误 - 没有用合适的方式收集结果,直接echo会导致输出顺序混乱,而且难以后续处理
修正后的完整代码
<?php // 你的目标HTML结构 $html = '<div> <div> <div> <p>Hi</p> </div> <p>Hello</p> </div> <p>Hey</p> </div>'; // 初始化DOM解析器 $dom = new DOMDocument(); // 关闭HTML规范检查的错误提示,避免不规范HTML导致的警告 libxml_use_internal_errors(true); $dom->loadHTML($html); libxml_clear_errors(); /** * 递归遍历div,提取所有p标签内容 * @param DOMElement $divNode 当前遍历的div节点 * @param array $result 存储结果的数组(引用传递) * @param int $currentLevel 当前嵌套层数,限制最多15层 */ function divDigger($divNode, &$result, $currentLevel = 1) { // 超过15层嵌套则停止递归,符合需求限制 if ($currentLevel > 15) { return; } // 提取当前div下的所有p标签 $pTags = $divNode->getElementsByTagName('p'); foreach ($pTags as $p) { // 获取p标签的纯文本内容,trim清理多余空格 $result[] = trim($p->nodeValue); } // 获取当前div下的所有子div,递归处理 $childDivs = $divNode->getElementsByTagName('div'); foreach ($childDivs as $childDiv) { divDigger($childDiv, $result, $currentLevel + 1); } } // 存储所有p标签内容的数组 $pContents = []; // 获取最外层的div节点(这里取第一个div作为根节点) $rootDiv = $dom->getElementsByTagName('div')->item(0); // 调用递归函数提取内容 divDigger($rootDiv, $pContents); // 输出结果,用空格分隔 echo implode(' ', $pContents); // 最终输出:Hi Hello Hey ?>
代码关键点说明
- DOMDocument解析:用PHP自带的DOM扩展来处理HTML,能正确解析嵌套结构,比字符串处理可靠得多
- 引用传递结果:通过
&$result把结果数组在递归中传递,避免每次递归重新创建数组,方便收集所有内容 - 嵌套层数限制:加入
$currentLevel参数,确保递归不会超过15层,符合你的需求 - 文本内容获取:用
nodeValue获取p标签的纯文本,trim去掉多余的空格和换行,保证输出整洁 - 变量名规范:用
$divNode和$childDiv避免变量名冲突,递归逻辑更清晰
如果你不需要严格限制15层,也可以去掉$currentLevel相关的判断,代码依然能正常工作。
内容的提问来源于stack exchange,提问作者parth agrawal
相关产品推荐
相关产品推荐

