PHP JSON 解析器与Javascript JSON 解析器

标签 php javascript json

我有一个通过 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/

相关文章:

javascript - 如何在分组时删除重复的数组(按 id)?

javascript - Json 对象在 while 循环中断页面期间进行字符串检查

javascript - 我正在使用 Photo Sphere Viewer,现在我想将全景图像替换为新图像,而无需重新加载页面

javascript - 用于简化javascript中表达式的递归函数

php - 需要在 PHP 中使用最少的内存使用的类似数组的结构

c# - 保存包的 breezejs 问题

php - 多次插入 PHP MYSQL

javascript - 为什么 JavaScript 查看器没有显示在 Eclipse 编辑器选择中?

javascript - PHP条件下向元素添加html

php - Jira REST API 的文件附件返回空数组