【发布时间】:2010-11-06 02:48:12
【问题描述】:
PHP的json_encode函数没有转义字符串中的所有JSON控制字符有什么原因吗?
例如,让我们取一个跨越两行并在其中包含控制字符(\r \n " / \)的字符串:
<?php
$s = <<<END
First row.
Second row w/ "double quotes" and backslash: \.
END;
$s = json_encode($s);
echo $s;
// Will output: "First row.\r\nSecond row w\/ \"double quotes\" and backslash: \\."
?>
请注意,回车符和换行符是未转义的。为什么?
我使用 jQuery 作为我的 JS 库,它的 $.getJSON() 函数在您完全 100% 信任传入数据时会很好。否则我会像其他人一样使用 JSON.org 的库 json2.js。 但是,如果您尝试解析该编码字符串,则会引发错误:
<script type="text/javascript">
JSON.parse(<?php echo $s ?>); // Will throw SyntaxError
</script>
而且您无法获取数据!如果您删除或转义该字符串中的 \r \n " 和 \,则 JSON.parse() 不会引发错误。
是否有任何现有的、良好的 PHP 函数用于转义控制字符。带有搜索和替换数组的简单 str_replace 将不起作用。
【问题讨论】:
-
而不是 学习使用 =$s?> :) 只是我的提示。
-
感谢您的提示,但快捷回显语法仅在启用 short_open_tag 且我从未使用过短开始标签时才有效,因为我更喜欢
-
@Thinker 另外,如果短开标签在服务器上被关闭,那么您的代码不仅会中断,还会输出到浏览器。
-
@BadHorsie 在发表错误评论之前检查自己。 = 并不是不好的做法,即使从 PHP 5.4 起关闭短标签,它也始终启用。另请阅读php-fig.org/psr/psr-1 了解编码标准
-
@mewm 你是对的,几年前我发表了评论,当时情况有所不同。从那以后,我自己一直在使用短回声标签一段时间。删除了 cmets 以避免向未来的访问者提供不良信息。