2013-07-02 93 views
3

我通过PHP连载的json_encode有一个数组:PHP JSON解析器诉JavaScript的JSON解析器

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})?)\/?)?(\/?(?.*))"}'); 

然后,我不明白为什么我得到一个错误“未捕获SyntaxError:意外的令牌w“? 是PHP和Javascript JSON解析器的区别?

回答

4

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

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

下面的例子,模仿PHP渲染JSON逐字的声明,在JS控制台正常工作:

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

如果你想使用JSON.parse,你必须先双逃不出你的JSON字符串PHP

$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})?)\\/?)?(\\/?(?.*))"}') 
+0

需要注意的是,这只是必要的BEC是非常重要的因为他将JSON作为一个文字输入到JS程序中。如果JSON通过网络传递并由JS以这种方式处理,则不是必需的。 – Barmar

+0

好的,我明白了。谢谢。 – Jasper