json_encode 的斜线问题。为啥以及如何解决它?

Posted

技术标签:

【中文标题】json_encode 的斜线问题。为啥以及如何解决它?【英文标题】:Slash issue with json_encode. Why and how to solve it?json_encode 的斜线问题。为什么以及如何解决它? 【发布时间】:2011-10-08 06:48:53 【问题描述】:

为什么输出这个日期("2011/7/11")json_encode 会显示("2011\/7\/11")

如何将"2011\/7\/11" 转换为"2011/7/11"

$data_go = '2011/7/11';
$ddmmyyy='([1-9][\d]3)[- \/.]([0-1][\d])[- \/.]([0-3][\d])';
            if(preg_match("/$ddmmyyy$/", $data_go)) 
            $year = substr($data_go,0,4);
            $month = substr($data_go,5,2);
            $day = substr($data_go,8,2);
            $j2g = $this->convert_date->JalaliToGregorian($year, $month, $day);
             $ok = $j2g[0]."/".$j2g[1]."/".$j2g[2];
            else 
              return FALSE;
            
echo json_encode($ok); // output "2011\/7\/11"

【问题讨论】:

"2011\/7\/11" 是有效的 JSON 字符串...所有 / 必须通过前缀 \ 进行转义 @Salman A:我该怎么办?怎么样? 您打算如何处理输出?为什么不echo $ok; 2011/7/11-> 删除了反斜杠。为什么 json_encode 不能去掉反斜杠? 有一个反斜杠是有效的JSON 【参考方案1】:

php 5.4 中,你可以使用JSON_UNESCAPED_SLASHES:

echo json_encode("2011/7/11", JSON_UNESCAPED_SLASHES);

否则,您必须进行一些琐碎的后处理

str_replace('\\/', '/', json_encode("2011/7/11"));

请注意,\/ 是在 JSON 中表示 / 的有效方式。

【讨论】:

json_encode 需要这个标志来输出典型的 json 本质上是 PHP 的一个 bug。 json 规范不需要转义斜杠。 bugs.php.net/bug.php?id=49366 PHP 使用历史逻辑导致magic_quotes_gpc 出现在过去。即,它尝试进行半成品编码,以避免由于缺少编码而导致的大多数简单攻击。在这种情况下,原因是允许 Web 开发人员对 "<script>".json_encode($whatever)."</script>" 进行编码,其中 $whatever 可能在某处包含文字 "</script>"。斜杠的可选编码会将"</script>" 转换为"<\/script>",从而避免将字符串的其余部分解释为原始html 的问题。【参考方案2】:
$data_go = str_replace('\'','', $data_go);

它将删除所有正斜杠并为您提供所需的结果..

【讨论】:

这有错误:解析错误:语法错误,意外的 T_ENCAPSED_AND_WHITESPACE ... 在转义后缺少一个单引号。那行应该是$data_go = str_replace('\'','', $data_go); 这段代码只是简单地将单引号替换为空。 Artefacto 做对了。

以上是关于json_encode 的斜线问题。为啥以及如何解决它?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 json_encode 添加反斜杠?

为啥 unset() 会改变 json_encode 格式化字符串的方式?

为啥 json_encode 会返回一个空字符串

暴力枚举解两条斜线问题

为啥斜线在 JSON 中是可转义字符? [复制]

为啥代客共享不像本地代客那样在请求中添加斜线