3

我有一个通过 PHP 序列化的 json_encode 的数组:

json_encode(array('pattern' => '^(?:/?site/(?[\w\-]+))?(?:/?intl/(?[a-z]{2}(?:\-[a-z]{2})?)/?)?(/?(?.*))'));
// output json: {"pattern":"^(?:\/?site\/(?[\\w\\-]+))?(?:\/?intl\/(?[a-z]{2}(?:\\-[a-z]{2})?)\/?)?(\/?(?.*))"}

我试图用Javascript解码:

JSON.parse('{"pattern":"^(?:\/?site\/(?[\\w\\-]+))?(?:\/?intl\/(?[a-z]{2}(?:\\-[a-z]{2})?)\/?)?(\/?(?.*))"}');

然后我不明白为什么会收到错误“Uncaught SyntaxError: Unexpected token w”??PHP 和 Javascript JSON 解析器有区别吗?

4

1 回答 1

4

问题是因为您使用 JSON.parse() 并将 JSON 字符串括在单引号中。

因此,您的转义正则表达式字符串在外部字符串文字(单引号)的解释中未转义,然后在字符串值的解释中混淆pattern(双引号),最终导致 JavaScript 在试图破译时窒息“\w”。

以下示例模仿 PHP 将 JSON 逐字呈现为声明,在 JS 控制台中运行良好:

var json = {"pattern":"^(?:\/?site\/(?[\\w\\-]+))?(?:\/?intl\/(?[a-z]{2}(?:\\-[a-z]{2})?)\/?)?(\/?(?.*))"}

如果你想使用 JSON.parse,你必须首先在 PHP 中对 JSON 字符串进行双重转义

$json = json_encode(array('pattern' => '^(?:/?site/(?[\w\-]+))?(?:/?intl/(?[a-z]{2}(?:\-[a-z]{2})?)/?)?(/?(?.*))'));
$json = str_replace('\', '\\', $json);
// output json: {"pattern":"^(?:\\/?site\\/(?[\\\\w\\\\-]+))?(?:\\/?intl\\/(?[a-z]{2}(?:\\\\-[a-z]{2})?)\\/?)?(\\/?(?.*))"}

然后,在 JS 中:

var json = JSON.parse('{"pattern":"^(?:\\/?site\\/(?[\\\\w\\\\-]+))?(?:\\/?intl\\/(?[a-z]{2}(?:\\\\-[a-z]{2})?)\\/?)?(\\/?(?.*))"}')
于 2013-07-02T02:57:16.083 回答