从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
相关产品推荐
相关产品推荐

