PHP中JSON内正则表达式导致json_decode语法错误的排查与解决
PHP解析含正则的JSON报语法错误?问题出在这!
我刚帮你捋清楚这个问题了,你遇到的坑其实是PHP字符串解析规则和JSON语法规则的双重冲突,咱们一步步拆解:
问题根源
你在线验证JSON没问题,是因为在线工具里你输入的"Hello\s+World"是直接作为JSON字符串处理的,但到了PHP的Heredoc语法里,情况就变了:
- JSON的硬性要求:JSON字符串里的反斜杠
\是转义字符,必须用另一个反斜杠转义它——也就是说,要在JSON里表示正则里的\s,必须写成\\s,不然JSON解析器会认为这是非法的转义序列。 - 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
相关产品推荐
相关产品推荐

