json_encode()转义正斜杠


164

我从Instagram提取JSON:

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

然后将变量解析为PHP数组以重组数据,然后重新编码和缓存文件:

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

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

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

我从搜索中收集到json_encode()自动执行此操作...是否可以禁用它?


2
它是可选的:“必须转义的字符:引号,反斜线和控制字符(U + 0000至U + 001F)。任何字符都可以转义。”
ThiefMaster 2012年

Answers:


284

有没有办法禁用它?

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

重要的阅读之前:https : //stackoverflow.com/a/10210367/367456(知道你在做什么-知道你的敌人)

json_encode($str, JSON_UNESCAPED_SLASHES);

如果您手头没有PHP 5.4,请选择许多现有功能之一,然后根据需要对其进行修改,例如http://snippets.dzone.com/posts/show/7487(存档副本)

示范范例

<?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://stackoverflow.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/"

2
这个答案很不切实际,但是作为标准的JSON编码,您应该保留它的转义,然后在接收端撤消转义的php strip_slashes和JS phpjs.org/functions/stripslashes
Barkermn01 2014年

1
@MartinBarker:这可能仅是PHP 5.2.1的问题:3v4l.org/0AahO-JSON在两种情况下均有效。
哈克(Hakre)

@MartinBarker出于某些奇怪的原因,正斜杠并未在接收端使用stripslashes(),str_replace()或preg_replace()进行剥离。在找到答案之前,我通过使用urlencode()然后替换%2F破解了一种消除斜线的方法。我在Windows上使用PHP7。不知道某个地方是否存在错误,但是PHP7甚至没有包含魔术引号,因此最好通过简单地禁用斜杠来避免黑客入侵。
萨米·福阿德

@SamiFouad:即使使用斜杠,它也是正确的JSON,并且不会造成任何问题(除非接收方不能正确处理JSON,请参阅json.org,尤其是右侧的char描述,该描述明确命名\/为的有效转义序列/) ,也请参见stackoverflow.com/a/10210367/367456
hakre

丑陋的PHP!JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES必须是默认的,没有(怪)选项...如何说给PHP开发人员?
彼得·克劳斯

45

是的,但是不要逃脱正斜杠是件好事。在<script>标记内使用JSON时,必须在</script>任何地方(甚至在字符串内)都将结束脚本标记。

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


5
因此,当javascript提取json时,javascript将自动删除反斜杠,还是我需要指定的东西?
Michael C.

5
它将自动处理它。像许多其他语言一样,转义没有特殊含义的字符只会使那些字符孤独。
ThiefMaster

19
@MichaelC。在JSON中,字符串值与字符串值"\/"完全相同"/"-正常工作的JSON解析器将对其进行处理。相同的规则适用于javascript字符串,因此将JSON作为javascript代码输入也不会有任何麻烦。我很惊讶PHP甚至有该JSON_UNESCAPED_SLASHES标志。
Esailija 2012年

4
但是,如果将数据编码为JSON然后存储到数据库列中怎么办?如果程序具有某种为数据库目的而转义字符的机制,那么由于现在正对斜杠进行两次转义,此功能是否会很不方便?
Xavier_Ex 2014年

5
假设JSON实现转义了斜杠,则无需编码就可以将JSON转储到脚本标签中,这似乎最终会咬住您。
Ryan

3

另一方面,PHPUNIT存在一个问题,即断言url包含在json_encoded中或等于url_-

我的期望:

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

将被编码为:

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

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

addcslashes($url, '/')

在我进行比较时允许适当的输出。



-1

您不需要转义正斜杠!HTML5和JS允许使用'引号和'引号。因此在JSON中,我输入:

    "index4":{"<a href='http://example.com'>example</a>"}

参见网站ev.bingo作为工作示例:“ v4”:[“奥迪e-tron Q4 Sportback充分利用了大众汽车集团共享的MEPP模块化电推进平台”],

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.