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 将不起作用。
最佳答案
function escapeJsonString($value) {
# list from www.json.org: (\b backspace, \f formfeed)
$escapers = array("\\", "/", "\"", "\n", "\r", "\t", "\x08", "\x0c");
$replacements = array("\\\\", "\\/", "\\\"", "\\n", "\\r", "\\t", "\\f", "\\b");
$result = str_replace($escapers, $replacements, $value);
return $result;
}
我正在使用上面的函数转义反斜杠(必须是数组中的第一个)并且应该处理换页符和退格(我不认为 \f
和 \b
在 PHP 中支持)。
关于PHP json_encode 不会转义所有 JSON 控制字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1048487/