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

使用PHP DOM Parser遍历指定HTML代码的实现方法

使用PHP DOM Parser处理评分HTML片段的解决方案

没问题,我来给你演示怎么用PHP DOM Parser处理这段评分HTML片段。这里我会用DOMDocument配合DOMXPath来精准定位和提取数据,这是处理HTML解析最可靠的方式之一,能轻松应对多个评分模块的场景。

完整代码示例

<?php
// 先禁用libxml的错误提示,避免HTML片段不规范导致的警告干扰
libxml_use_internal_errors(true);

// 你的目标HTML片段(我补全了后半部分的闭合标签,确保解析正常)
$html = '<div class="reviews-summary__stats"> 
<div class="reviews-summary"> 
<p class="reviews-title">A</p> 
<ul class="rating"> 
<li class="rating__item rating__rated"></li> 
<li class="rating__item rating__rated"></li> 
<li class="rating__item rating__rated"></li> 
<li class="rating__item rating__rated"></li> 
<li class="rating__item "></li> 
<li class="rating__item "></li> 
</ul> 
</div> 
<div class="reviews-summary">
<p class="reviews-title">B</p>
<ul class="rating">
<li class="rating__item rating__rated"></li>
<li class="rating__item rating__rated"></li>
<li class="rating__item "></li>
<li class="rating__item "></li>
<li class="rating__item "></li>
<li class="rating__item "></li>
</ul>
</div>
</div>';

// 初始化DOM文档对象
$dom = new DOMDocument();
// 加载HTML片段
$dom->loadHTML($html);

// 创建XPath查询对象,方便精准定位元素
$xpath = new DOMXPath($dom);

// 先定位所有的评分模块(.reviews-summary)
$reviewModules = $xpath->query('//div[@class="reviews-summary"]');

if ($reviewModules->length > 0) {
    foreach ($reviewModules as $module) {
        // 提取评分标题(比如示例里的"A"、"B")
        $titleNode = $xpath->query('.//p[@class="reviews-title"]', $module)->item(0);
        $title = $titleNode ? trim($titleNode->nodeValue) : '未命名评分';
        
        // 用XPath直接统计总星数和已评分的星数,比遍历更高效
        $totalStars = $xpath->query('.//ul[@class="rating"]/li', $module)->length;
        $ratedStars = $xpath->query('.//ul[@class="rating"]/li[contains(@class, "rating__rated")]', $module)->length;
        
        // 输出结果,也可以把数据存到数组里后续使用
        echo "评分标题: {$title}\n";
        echo "总星数: {$totalStars}\n";
        echo "已点亮星数: {$ratedStars}\n";
        // 如果需要换算成5分制的评分(比如常见的星级展示)
        $score = ($ratedStars / $totalStars) * 5;
        echo "换算后评分: " . number_format($score, 2) . "/5\n";
        echo "-------------------------\n";
    }
} else {
    echo "未找到任何评分模块";
}

// 最后清除libxml的错误缓存
libxml_clear_errors();
?>

代码关键点说明

  1. 处理不规范HTML:用libxml_use_internal_errors(true)关闭XML解析的错误提示,因为实际场景中HTML片段经常有不闭合标签或格式问题,这样不会中断代码执行。
  2. XPath精准查询:
    • //div[@class="reviews-summary"]:全局查找所有评分模块
    • .//p[@class="reviews-title"]:在当前模块内部查找标题(.表示相对路径,避免全局匹配)
    • li[contains(@class, "rating__rated")]:直接筛选出带有已评分标记的li元素,比遍历所有li更高效,还能兼容class顺序变化、额外添加其他类的情况。
  3. 灵活的数据处理:你可以把提取到的标题、星数等数据存入数组,而不是直接echo,方便后续存入数据库或展示到页面。

简化版(仅处理单个评分模块)

如果确定只有一个评分模块,代码可以更简洁:

<?php
libxml_use_internal_errors(true);
$html = '<div class="reviews-summary__stats"> 
<div class="reviews-summary"> 
<p class="reviews-title">A</p> 
<ul class="rating"> 
<li class="rating__item rating__rated"></li> 
<li class="rating__item rating__rated"></li> 
<li class="rating__item rating__rated"></li> 
<li class="rating__item rating__rated"></li> 
<li class="rating__item "></li> 
<li class="rating__item "></li> 
</ul> 
</div> 
</div>';

$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);

$ratedStars = $xpath->query('//ul[@class="rating"]/li[contains(@class, "rating__rated")]')->length;
$totalStars = $xpath->query('//ul[@class="rating"]/li')->length;

echo "已点亮星数: {$ratedStars}/{$totalStars}";
libxml_clear_errors();
?>

内容的提问来源于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.26 10:44:50