我有一个通过 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 解析器有区别吗?
最佳答案
问题是因为您正在使用 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})?)\\/?)?(\\/?(?.*))"}')
关于PHP JSON 解析器与Javascript JSON 解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17416689/