PHP Simple DOM Parser遍历HTML:关联div.name的span与对应span.roll
解决PHP Simple DOM Parser获取对应span.roll的问题
我来帮你搞定这个问题!你遇到的情况其实是HTML里的空白字符(空格、换行)被Simple DOM Parser当成了文本节点,直接用next_sibling()大概率拿到的不是目标<span class="roll">,而是这些没用的空白节点。下面给你两种实用的解决方案:
方法一:遍历兄弟节点,跳过文本节点
这种方法会逐个检查当前div.name的下一个兄弟节点,直到找到目标<span class="roll">,适配性更强,哪怕HTML结构有少量额外空白也没问题:
require_once('simple_html_dom.php'); // 加载目标HTML内容 $html = str_get_html('<div id="score"> <div class="name"><span style="width:68%">A</span></div> <span class="roll">1</span> <div class="name"><span style="width:60%">B</span></div> <span class="roll">2</span> <div class="name"><span style="width:56%">C</span></div> <span class="roll">3</span> </div>'); // 遍历所有div.name元素 foreach($html->find('div.name') as $name_div) { // 获取div内的span标签及信息 $name_span = $name_div->find('span', 0); $name_text = $name_span->innertext; // 提取width数值(可选操作) preg_match('/width:(\d+)%/', $name_span->style, $width_matches); $width = $width_matches[1] ?? '未知'; // 查找对应的span.roll $roll_span = null; $next_node = $name_div->next_sibling(); while($next_node) { // 跳过文本节点,只匹配目标span.roll if($next_node->tag === 'span' && $next_node->class === 'roll') { $roll_span = $next_node; break; } $next_node = $next_node->next_sibling(); } // 输出结果 if($roll_span) { echo "姓名: {$name_text}, 宽度: {$width}%, 编号: {$roll_span->innertext}<br>"; } else { echo "姓名: {$name_text} - 未找到对应编号<br>"; } } // 清理资源 $html->clear();
方法二:按索引配对元素
如果你的HTML结构是严格的div.name和span.roll成对出现,这种方法更简洁高效:
require_once('simple_html_dom.php'); $html = str_get_html('<div id="score"> <div class="name"><span style="width:68%">A</span></div> <span class="roll">1</span> <div class="name"><span style="width:60%">B</span></div> <span class="roll">2</span> <div class="name"><span style="width:56%">C</span></div> <span class="roll">3</span> </div>'); // 获取所有div.name和span.roll元素集合 $name_divs = $html->find('div.name'); $roll_spans = $html->find('span.roll'); // 确保两组元素数量一致再遍历 if(count($name_divs) === count($roll_spans)) { foreach($name_divs as $index => $name_div) { $name_span = $name_div->find('span', 0); $name_text = $name_span->innertext; preg_match('/width:(\d+)%/', $name_span->style, $width_matches); $width = $width_matches[1] ?? '未知'; $roll_text = $roll_spans[$index]->innertext; echo "姓名: {$name_text}, 宽度: {$width}%, 编号: {$roll_text}<br>"; } } else { echo "元素数量不匹配,请检查HTML结构是否规范"; } $html->clear();
你可以根据自己的实际HTML结构选择合适的方案,两种方法都能正确关联每个div.name下的span和对应的span.roll标签。
内容的提问来源于stack exchange,提问作者Paras Prajapati
相关产品推荐
相关产品推荐

