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

从HTML源码提取JSON并解析遇空页问题求助

解决PHP提取并解析HTML中JSON的问题

首先,我一眼就看到你代码里的两个关键问题,咱们一步步来解决:

1. 核心错误:错误处理正则匹配结果

你现在把preg_match得到的数组用print_r转成字符串,再传给json_decode——这完全不对!preg_match匹配成功后,$json是一个数组,其中$json[0]才是真正匹配到的JSON字符串,你应该直接用这个值,而不是数组的打印文本。

2. 正则匹配到的JSON不完整

从你的调试结果看,匹配到的JSON少了末尾的},这会导致json_decode解析失败(返回null)。咱们可以换一个更可靠的递归正则,确保能匹配完整的嵌套JSON结构。

修正后的完整代码

// 直接获取HTML内容,不需要htmlspecialchars,转义反而会干扰正则匹配
$whole_html = file_get_contents("http://example.com");

// 用带s修饰符的递归正则,确保匹配完整的JSON(包括跨多行的情况)
preg_match('/\{(?:[^{}]|(?R))*\}/s', $whole_html, $json);

// 检查是否匹配到有效内容
if (!empty($json[0])) {
    // 直接使用匹配到的JSON字符串进行解析
    $json_decoded = json_decode($json[0], true);
    
    // 检查JSON解析是否成功
    if (json_last_error() === JSON_ERROR_NONE) {
        // 现在可以正常访问字段了
        var_dump($json_decoded['customer']['email']); // 会输出null,因为原始JSON里email字段就是null
        var_dump($json_decoded['customer']['is_eu']); // 会输出bool(true)
    } else {
        echo "JSON解析失败,错误信息:" . json_last_error_msg();
    }
} else {
    echo "未匹配到JSON内容";
}

额外注意事项

  • 去掉了htmlspecialchars():这个函数会转义HTML实体,反而可能破坏原始JSON的结构,影响正则匹配。
  • 正则添加s修饰符:让.能匹配换行符,确保JSON跨多行时也能被完整匹配。
  • 增加错误检查:用json_last_error()可以快速定位解析失败的原因,比如原始JSON本身存在语法错误(你提供的HTML片段里的JSON有个小问题:is_eu":true"多了一个双引号,正常应该是is_eu":true},如果目标页面的JSON真的有这个错误,需要先修正或者处理)。

内容的提问来源于stack exchange,提问作者Mario

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:42:38