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。在<script>
标签内使用 JSON 时,</script>
必须在任何地方——即使在字符串内——将结束脚本标签。
根据使用 JSON 的位置,它不是必需的,但可以安全地忽略。
【讨论】:
那么javascript在拉入json时会自动删除反斜杠,还是我需要指定的东西? 它会自动处理。与许多其他语言一样,在语言中转义没有特殊含义的字符只会留下这些字符。 @MichaelC。在 JSON 中,字符串值"\/"
与字符串值 "/"
完全相同 - 并且工作的 JSON 解析器会这样对待它。同样的规则适用于 javascript 字符串,因此将 JSON 作为 javascript 代码提供也不会有任何问题。我很惊讶 PHP 甚至有 JSON_UNESCAPED_SLASHES
标志。
但是,如果将数据编码为 JSON,然后将它们存储到数据库列中呢?如果程序为了数据库的缘故有某种机制来转义字符,那么这个功能会不会很不方便,因为现在斜杠被双重转义了?
在没有编码步骤的情况下将 JSON 转储到脚本标签中,假设 JSON 实现正在转义斜线,这似乎是一种肯定会最终咬你的做法。以上是关于json_encode() 转义正斜杠的主要内容,如果未能解决你的问题,请参考以下文章