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

PHP中JSON内正则表达式导致json_decode语法错误的排查与解决

PHP解析含正则的JSON报语法错误?问题出在这!

我刚帮你捋清楚这个问题了,你遇到的坑其实是PHP字符串解析规则和JSON语法规则的双重冲突,咱们一步步拆解:

问题根源

你在线验证JSON没问题,是因为在线工具里你输入的"Hello\s+World"是直接作为JSON字符串处理的,但到了PHP的Heredoc语法里,情况就变了:

  1. JSON的硬性要求:JSON字符串里的反斜杠\是转义字符,必须用另一个反斜杠转义它——也就是说,要在JSON里表示正则里的\s,必须写成\\s,不然JSON解析器会认为这是非法的转义序列。
  2. PHP Heredoc的特性:Heredoc和双引号字符串一样,会自动解析里面的转义序列。你写的\\s,PHP会把\\解析成单个\,最终传给json_decode的还是"Hello\s+World"——这就触发了JSON的语法错误。

解决方法

有两种简单的方式解决,选哪种看你习惯:

方法1:在Heredoc里用四个反斜杠

既然Heredoc里两个反斜杠会被解析成一个,那我们写四个反斜杠,最终就能在JSON里得到两个反斜杠(也就是JSON认可的转义格式):

<?php
$json = <<<EOD
{
  "regex": [
    "Hello\\\\s+World"
  ]
}
EOD;

$result = json_decode($json);
switch (json_last_error()) {
    case JSON_ERROR_NONE:
        echo ' - No errors';
        var_dump($result); // 能看到解析后的正则是Hello\s+World
        break;
    case JSON_ERROR_DEPTH:
        echo ' - Maximum stack depth exceeded';
        break;
    case JSON_ERROR_STATE_MISMATCH:
        echo ' - Underflow or the modes mismatch';
        break;
    case JSON_ERROR_CTRL_CHAR:
        echo ' - Unexpected control character found';
        break;
    case JSON_ERROR_SYNTAX:
        echo ' - Syntax error, malformed JSON';
        break;
    case JSON_ERROR_UTF8:
        echo ' - Malformed UTF-8 characters, possibly incorrectly encoded';
        break;
    default:
        echo ' - Unknown error';
        break;
}

方法2:改用PHP的Nowdoc语法

Nowdoc和Heredoc类似,但它用单引号包裹标识符,不会解析任何转义序列和变量,所以你只需要写两个反斜杠就能满足JSON的要求:

<?php
$json = <<<'EOD'
{
  "regex": [
    "Hello\\s+World"
  ]
}
EOD;

$result = json_decode($json);
switch (json_last_error()) {
    case JSON_ERROR_NONE:
        echo ' - No errors';
        var_dump($result);
        break;
    case JSON_ERROR_DEPTH:
        echo ' - Maximum stack depth exceeded';
        break;
    case JSON_ERROR_STATE_MISMATCH:
        echo ' - Underflow or the modes mismatch';
        break;
    case JSON_ERROR_CTRL_CHAR:
        echo ' - Unexpected control character found';
        break;
    case JSON_ERROR_SYNTAX:
        echo ' - Syntax error, malformed JSON';
        break;
    case JSON_ERROR_UTF8:
        echo ' - Malformed UTF-8 characters, possibly incorrectly encoded';
        break;
    default:
        echo ' - Unknown error';
        break;
}

小技巧:快速排查

如果你不确定最终传给json_decode的字符串是否合规,可以先echo $json;查看输出——正常情况下应该看到"Hello\\s+World",而不是"Hello\s+World",这样就能快速定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:46:53