You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:18:58