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字符无法解析。
你当前代码的核心问题
你遇到的解析失败和上述特殊字符无关,是两个可直接修复的格式问题:
- 内容中的双引号全部被编码为HTML实体
",不是JSON可识别的双引号格式。 - 把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
相关产品推荐
相关产品推荐

