【问题标题】:Escaping Characters When Building JSON in PHP and Echoing It in <script>在 PHP 中构建 JSON 时转义字符并在 <script> 中回显它
【发布时间】:2014-10-31 06:39:45
【问题描述】:

我正在尝试在 PHP 中构建一个大型 JSON 字符串,然后将其回显到客户端,例如 this。我的问题是 PHP 函数 json_encode 没有正确转义用于 javascript 的字符。

这是我的数据:

my_table
------------------------------------------------------------------
|       title       |                 description                |
------------------------------------------------------------------
| Something's "Fun" | Hello[invisible carriage return char]World |
------------------------------------------------------------------

这些数据中有三个字符需要转义:单引号、双引号和回车符。

这是我将数据转换为 json 的 php(在我将数据放入对象之后):

$array = array(
   'title' => obj->title,
   'desc' => obj->description
);

$json = json_encode($array);

然后,我将带有“正确”转义字符的 json 字符串从我的视图中回显到客户端,如下所示:

<script>
   var jsonString = '<?php echo $json; ?>';
   var obj = JSON.parse(jsonString);
</script>

但是当页面加载时,我的浏览器 (Chrome) 会推送“意外标识符”错误,因为这是脚本标签的实际外观:

<script>
   var jsonString = '{"title":"Something's \"Fun\"","desc":"Hello\nWorld"}';
   var obj = JSON.parse(jsonString);
</script>

从 js 的角度来看,双引号是唯一正确转义的。单引号根本没有转义,js 在 \n 处吓坏了。

顺便说一句:手动转义单引号不起作用。而且我不知道如何处理 \n 才能让 js 识别它。

【问题讨论】:

  • json_encode 应该已经返回了一个有效的 JavaScript 对象字面量,因此无需再次解析它。
  • 为什么要将 JSON 输出重新包装在一个字符串中,然后再次解析它? (如果你真的必须:应用 json_encode 两次,而不是自己添加引号。)
  • [手掌到额头] @Gumbo,你是对的!不知道我在想什么。我想有那么一刻我脑筋急转弯并忘记了 json 已经被写成一个 js 对象——这就是重点。 [再次手掌到额头] 发布这个答案,我会接受。
  • @mario 你的评论听起来也不错。
  • 没有人想发表答案?

标签: javascript php json escaping


【解决方案1】:

这简直是对json是什么的误解:字面意思写成可以创​​建javascript对象的格式。因此,一旦 json 字符串以 &lt;script&gt; 标记回显到页面,就无需解析它。视图中的代码应如下所示:

<script>
   var obj = <?php $json; ?>;
</script>

【讨论】:

  • 您可能希望改为使用JSON.parse(&lt;?php $json; ?&gt;);。此外,将 PHP 直接包含到 javascript 中似乎很奇怪。你应该在这里使用 AJAX 或者简单地使用 PHP 来显示你的数据。
  • @user1477388 您的示例导致了与我的代码相同的问题。 (没有必要再次解析它,因为上面的 cmets 状态。)是的,ajax 是一个可行的选择,但在我的情况下,创建更多对服务器的调用没有意义。此外,让 PHP 将其发送到 html 中的页面绝对是另一种选择,但在我的情况下,它创建了很多不必要的标记。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多