
PHP 的 json_decode() 要求输入为严格符合 JSON 规范的字符串;若源字符串使用单引号包裹且含 " 转义序列,PHP 不会解析反斜杠,导致生成非法 JSON,最终返回 null。
php 的 `json_decode()` 要求输入为严格符合 json 规范的字符串;若源字符串使用单引号包裹且含 `"` 转义序列,php 不会解析反斜杠,导致生成非法 json,最终返回 `null`。
在 PHP 中,json_decode() 对输入字符串的合法性极为敏感——它不接受语法错误的 JSON,哪怕只是引号转义不当。你遇到的 NULL 返回值,根本原因在于字符串定义方式与 PHP 字符串解析机制的冲突。
? 问题根源:单引号字符串不解析转义序列
PHP 官方文档明确指出:单引号字符串中, 和 " 不会被解释为转义字符,而是作为字面量字符保留。因此:
$text = '{"sub":"value"}'; // ✅ 正确:双引号内 " 被解析为 "
$text = '{"sub":"value"}'; // ❌ 错误:单引号中 " 就是反斜杠+双引号 → '{"sub":"value"}' 实际内容为:{"sub":"value"}
后者实际存储的字符串是 17 个字符:{, , ", s, u, b, ", :, ", v, a, l, u, e, ", } —— 这不是合法 JSON(JSON 不允许未转义的裸反斜杠出现在字符串内部),故 json_decode() 直接失败,返回 null。
✅ 正确做法:确保输入为合法 JSON 字符串
方案 1:使用双引号定义原始字符串(推荐用于硬编码场景)
$text = "{"sub":"value"}"; // 双引号内 " → 自动转义为 "
$json = json_decode($text, true);
var_dump($json); // array(1) { ["sub"]=> string(5) "value" }
方案 2:从外部来源(如 HTML <script>)提取后清洗(适用于爬虫/SSR 场景)</script>
你提到的真实场景(如 OLX 页面中的 window.__PRERENDERED_STATE__=)属于典型服务端渲染(SSR)注入数据。此时字符串通常以 JavaScript 字面量形式存在,可能含多余转义或非标准语法(如末尾分号、注释、Unicode 转义等)。需谨慎清洗:
// 示例:从 HTML 片段中提取并修复
$html = file_get_contents('https://www.olx.pl/oferta/...');
if (preg_match('/window.__PRERENDERED_STATE__s*=s*'([^']+)'/', $html, $matches)) {
$raw = $matches[1];
// 注意:JS 单引号字符串中的 " 实际是字面量,需替换为 "(但要避免误伤)
// 更安全的方式:用 json_decode 多次尝试 + 修复常见 JS 非标准写法
$clean = str_replace([''', '\''], ['"', '"'], $raw); // 简单替换单引号和转义单引号
$clean = preg_replace('/(?<blockquote><p>⚠️ <strong>重要提醒</strong>:切勿依赖 str_replace('"', '"') 粗暴替换——若原始字符串本身含真实反斜杠(如路径 C:Users
ame),该操作将破坏语义。应优先使用正则精准匹配上下文,或借助 json_decode() 的错误反馈进行迭代修复。</p></blockquote><h3>✅ 最佳实践总结</h3>
- ✅ 硬编码 JSON 字符串时,始终用双引号包裹,确保转义生效;
- ✅ 从 HTML/JS 上下文中提取 JSON 时,先定位边界(如 = 后到 ; 或 前),再做最小化清洗;
- ✅ 永远检查 json_decode() 返回值,并用 json_last_error() 和 json_last_error_msg() 定位具体错误;
- ❌ 避免对未知来源字符串盲目 str_replace,易引入安全与兼容性风险;
- ? 补充技巧:若 JSON 来自不可信 JS 上下文,可考虑用 eval()(极度不推荐)或更安全的 json5 类库(需额外安装),但标准 json_decode() + 精准预处理仍是首选。
遵循以上原则,即可稳定解析含转义引号的 JSON 字符串,彻底规避 NULL 返回陷阱。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











