PHP:JSON中的正则表达式会导致json_decode出现问题吗?

Sta*_*bie 5 php regex json escaping

我的JSON中有一些正则表达式,当我在在线JSON验证器上测试我的JSON时,这似乎不是问题.但是,当我接受JSON字符串并尝试json_decode()在PHP中时,我得到一个JSON_ERROR_SYNTAX.

有什么想法吗?我该如何解决这个问题?

示例代码:

<?php

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

json_decode($json);

switch (json_last_error()) {
    case JSON_ERROR_NONE:
        echo ' - No errors';
    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;
}
Run Code Online (Sandbox Code Playgroud)

问题在于\s.改变它\\s没有帮助.

Sam*_*tch 7

当您"\s"使用PHP 编写时,文字字符串是\s因为\s它不是有效的转义序列.

当你用"\\s"PHP 编写时,文字字符串是\s因为\\ 一个有效的转义序列.

另一方面,JSON会为无效的转义序列抛出错误,这是你的问题.

解决方案: 不要手工编写JSON.

$json = json_encode(['regex'=> ['Hello\s+World']]);
Run Code Online (Sandbox Code Playgroud)

输出:{"regex":["Hello\\s+World"]}[注意:文字字符串,有效的JSON]

糟糕的解决方案比它的价值更麻烦,可能会导致问题: "Hello\\\s+World"欢迎逃离地狱.