json_encode() 转义正斜杠

Posted

技术标签:

【中文标题】json_encode() 转义正斜杠【英文标题】:json_encode() escaping forward slashes 【发布时间】:2012-04-29 22:05:32 【问题描述】:

我正在从 Instagram 中提取 JSON:

$instagrams = json_decode($response)->data;

然后将变量解析成php数组来重构数据,然后重新编码和缓存文件:

file_put_contents($cache,json_encode($results));

当我打开缓存文件时,我所有的正斜杠“/”都被转义了:

http:\/\/distilleryimage4.instagram.com\/410e7...

我从我的搜索中收集到 json_encode() 会自动执行此操作...有没有办法禁用它?

【问题讨论】:

可选:“必须转义的字符:引号、反斜线和控制字符(U+0000 到 U+001F)。任何字符都可以转义。” 【参考方案1】:

我不得不遇到这样的情况,简单地说,

str_replace("\/","/",$variable)

确实为我工作。

【讨论】:

这是正确的,str_replace("\\/","/",$variable)str_replace('\/','/',$variable)【参考方案2】:

有没有办法禁用它?

是的,您只需要使用JSON_UNESCAPED_SLASHES 标志。

!important 之前阅读:https://***.com/a/10210367/367456(知道你在处理什么 - 知道你的敌人)

json_encode($str, JSON_UNESCAPED_SLASHES);

如果您手头没有 PHP 5.4,请从众多现有函数中选择一个并根据您的需要对其进行修改,例如http://snippets.dzone.com/posts/show/7487 (archived copy).

Example Demo

<?php
/*
 * Escaping the reverse-solidus character ("/", slash) is optional in JSON.
 *
 * This can be controlled with the JSON_UNESCAPED_SLASHES flag constant in PHP.
 *
 * @link http://***.com/a/10210433/367456
 */    

$url = 'http://www.example.com/';

echo json_encode($url), "\n";

echo json_encode($url, JSON_UNESCAPED_SLASHES), "\n";

示例输出:

"http:\/\/www.example.com\/"
"http://www.example.com/"

【讨论】:

这个答案是 grate 但是 JSON 编码作为标准你应该把它保留为转义然后在接收端撤消转义 php 的 strip_slashes 和 JS phpjs.org/functions/stripslashes @MartinBarker:这可能只是 PHP 5.2.1 的问题:3v4l.org/0AahO - JSON 在两种情况下都有效。 @MartinBarker 出于某种奇怪的原因,正斜杠没有在接收端使用 stripslashes()、str_replace() 或 preg_replace() 进行剥离。在我找到这个答案之前,我拼凑了一种方法来通过使用 urlencode() 然后替换 %2F 来摆脱斜线。我在 Windows 上使用 PHP7。不确定某些地方是否存在错误,但 PHP7 中甚至不包含魔术引号,因此最好通过简单地禁用斜杠来避免黑客攻击。 @SamiFouad:即使有斜线,它也是正确的 JSON,不应该产生任何问题(除非接收者没有正确处理 JSON,请参阅 json.org,尤其是 char 右侧的描述将\/ 明确命名为/ 的有效转义序列),另请参见***.com/a/10210367/367456。 丑陋的 PHP! JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES 必须是默认的,而不是(奇怪的)选项...如何对 php-developers 说?【参考方案3】:

另一方面,我遇到了 PHPUNIT 断言 url 包含在或等于 json_encoded 的 url 中的问题 -

我的预期:

http://localhost/api/v1/admin/logs/testLog.log

将被编码为:

http:\/\/localhost\/api\/v1\/admin\/logs\/testLog.log

如果您需要进行比较,请使用以下方法转换 url:

addcslashes($url, '/')

在我的比较过程中允许正确的输出。

【讨论】:

【参考方案4】:

Yes,但不要 - escaping forward slashes is a good thing。在&lt;script&gt; 标签内使用 JSON 时,&lt;/script&gt; 必须在任何地方——即使在字符串内——将结束脚本标签。

根据使用 JSON 的位置,它不是必需的,但可以安全地忽略。

【讨论】:

那么javascript在拉入json时会自动删除反斜杠,还是我需要指定的东西? 它会自动处理。与许多其他语言一样,在语言中转义没有特殊含义的字符只会留下这些字符。 @MichaelC。在 JSON 中,字符串值 "\/" 与字符串值 "/" 完全相同 - 并且工作的 JSON 解析器会这样对待它。同样的规则适用于 javascript 字符串,因此将 JSON 作为 javascript 代码提供也不会有任何问题。我很惊讶 PHP 甚至有 JSON_UNESCAPED_SLASHES 标志。 但是,如果将数据编码为 JSON,然后将它们存储到数据库列中呢?如果程序为了数据库的缘故有某种机制来转义字符,那么这个功能会不会很不方便,因为现在斜杠被双重转义了? 在没有编码步骤的情况下将 JSON 转储到脚本标签中,假设 JSON 实现正在转义斜线,这似乎是一种肯定会最终咬你的做法。

以上是关于json_encode() 转义正斜杠的主要内容,如果未能解决你的问题,请参考以下文章

为啥 json_encode 添加反斜杠?

json_encode 添加反斜杠

php json_encode()在斜杠之前自动添加斜杠[重复]

PHP json_encode 反斜杠和数组名称的问题

如何使用json_encode回显没有反斜杠的值[重复]

如何让json_encode不转义斜杠