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

PHP中json_decode()解析JS提取的数组失败,哪些字符会导致该问题?

JSON格式禁用字符说明与代码修复方案

JSON规范不允许出现的字符及原因

  • 未转义的ASCII控制字符(ASCII 0-31):包含换行、回车、制表、退格、换页等不可见控制符。这类字符会干扰解析器的结构判定,必须以\b、\f、\n、\r、\t的转义形式出现在JSON字符串中。
  • 未转义的双引号:JSON的字符串边界固定为双引号,若字符串内容本身包含双引号,必须转义为\",否则解析器会误判字符串提前结束,导致结构断裂。
  • 非法转义字符:仅支持\\、\/、\"、\b、\f、\n、\r、\t、\uXXXX(四位十六进制Unicode编码)这几种转义格式,其他自定义转义写法均不被规范认可。
  • 未正确配对的Unicode代理对:U+D800到U+DFFF范围内的半代理字符如果没有正确配对,会被判定为无效Unicode字符无法解析。

你当前代码的核心问题

你遇到的解析失败和上述特殊字符无关,是两个可直接修复的格式问题:

  1. 内容中的双引号全部被编码为HTML实体",不是JSON可识别的双引号格式。
  2. 把HTML实体转回普通双引号后,array[1][0]对应的Cookie字符串中包含的JSON结构的双引号没有转义,直接打断了外层字符串的结构。比如还原后的内容中会出现"_lr_tabs_-qrlpn5/e2={"sessionID":0}"的结构,中间的"会被解析器判定为外层字符串的结束标记。

修复后的代码

$file_contents = 'var dati_login = [["1111","2021-10-30"],["_fbp=fb1111152; i18next=en-US; cookielaw_accepted=1; _ga=GA1.1.1111.1611118; e2sid=11115; _lr_uf_-qrlpn5=111-e111e-424c-9043-1111; _lr_tabs_-qrlpn5/e2={"sessionID":0,"recordingID":"111159d18955a","lastActivity":163480041112}; _lr_hb_-qrlpn5/e2={"heartbeat":1118402}; _ga_THFZJ5FYF8=GS1.1.11110.7.1.1111468.0","2021-10-30"]]';
// 第一步:将HTML实体转换为普通字符
$decoded_content = html_entity_decode($file_contents);
// 第二步:提取数组部分的字符串
$json_raw = substr($decoded_content, strpos($decoded_content, '['));
// 第三步:转义Cookie字段内部的双引号
$json_valid = preg_replace_callback('/(\["[^"]+","[^"]+",\[")(.*?)(",")/s', function($match) {
    return $match[1] . addslashes($match[2]) . $match[3];
}, $json_raw);
// 解析为PHP数组,第二个参数设为true返回关联数组
$array_dati = json_decode($json_valid, true);
print_r($array_dati);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:57:03