执行JSON.parse遇<0X02>控制符报错,如何通过PHP filter_var修复?
问题根因
- JSON规范明确禁止未转义的ASCII低阶控制字符(ASCII值<0x20,包含你遇到的<0x02>文本起始符)直接出现在JSON字符串中,JS内置的
JSON.parse()遇到这类未转义字符会直接抛出语法错误。 - 你当前的filter_var使用逻辑存在处理时机问题,同时你给出的示例JS代码中的字符串本身不符合JSON格式要求,缺少外层
{}包裹,也会触发解析错误。
基于PHP filter_var的修复方案
- 先对所有要放入JSON的输入字段单独执行过滤,不要在JSON生成后再做过滤,避免破坏JSON结构:
// 过滤单个字段,FILTER_FLAG_STRIP_LOW会移除所有ASCII值<32的控制字符,包括<0x02> $filteredUserName = filter_var($inputUserName, FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW); $filteredTitle = filter_var($inputTitle, FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW); // 构造关联数组后使用PHP内置json_encode生成合法JSON,禁止手动拼接JSON字符串 $responseData = [ 'userName' => $filteredUserName, 'title' => $filteredTitle ]; // 输出JSON时增加参数兜底转义特殊字符,进一步避免解析风险 echo json_encode($responseData, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT);
- 如果你需要保留换行、制表符这类常用低阶控制符,可以替换为自定义过滤规则,仅移除你不需要的控制符(如<0x02>),其余控制符交给
json_encode自动转义为JSON允许的\u00xx格式即可。
前端验证
过滤后生成的合法JSON传到前端后可直接解析:
// 示例:PHP输出的合法JSON字符串 const rawJson = '{"userName":"abcde","title":"xxx Offshore xxx"}'; const parsedData = JSON.parse(rawJson); console.log(parsedData);
内容的提问来源于stack exchange,提问作者Sujit Jha
相关产品推荐
相关产品推荐

