Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP JSON解析器v.s.Javascript JSON解析器_Php_Javascript_Json - Fatal编程技术网

PHP JSON解析器v.s.Javascript JSON解析器

PHP JSON解析器v.s.Javascript JSON解析器,php,javascript,json,Php,Javascript,Json,我有一个通过PHP serialize的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})?)\/?)?(\/?(?.

我有一个通过PHP serialize的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})?)\/?)?(\/?(?.*))"}');
然后我不明白为什么会出现错误“uncaughtsyntaxerror:unexpectedtokenw”??
PHP和Javascript JSON解析器有区别吗

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

因此,转义的正则表达式字符串在解释外部字符串文字(单引号)时被取消转义,然后在解释字符串<代码>模式(双引号)的值时被混淆,最终导致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})?)\\/?)?(\\/?(?.*))"}')

需要注意的是,这是必要的,因为他将JSON作为文本输入JS程序。如果JSON通过网络传递并由JS以这种方式处理,则不需要这样做。