PHP json_encode 不会转义所有 JSON 控制字符

标签 php json

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/

相关文章:

php - 数据表警告(表 ID = 'My Table'): Requested unknown parameter '0' from the data source

php - Symfony 4.3.1 和 FosUserBundle 2.1.2 的问题

javascript - 从 JSON 中的不同对象获取信息

javascript - 传递给外部 JavaScript 的 JSON 对象

javascript - JSON.parse 在有效 Json 上失败。已转义控制字符。如果

javascript - 将 {Object} 的嵌套 [Array] 转换为 > {Object} | JSON文件

php - 查询未正确运行

php - jquery 提交未传递表单值

javascript - 如何将值从 jQuery-AJAX 函数发送到 PHP 文件并访问 PHP 文件中的这些值?

javascript - 使用 angularjs 从 json 中获取 ng-options