PHP JSON String,JS输出的双引号转义

Luk*_*uke 39 php json escaping double-quotes

我正在从PHP数组创建一个JSON字符串.我用它编码了json_encode().

$data = array(
    'title' => 'Example string\'s with "special" characters'
);

$data = json_encode( $data );
Run Code Online (Sandbox Code Playgroud)

$data使用本地化wp_localize_script()并可通过全局data变量访问.

在JS文件中,我可以通过以下方式访问信息:

var data     = data.replace( /"/g, '"' ),
    jsonData = jQuery.parseJSON( data );

console.log( jsonData );
Run Code Online (Sandbox Code Playgroud)

这导致输出:

{ "title":"Example string's with "special" characters" }
Run Code Online (Sandbox Code Playgroud)

将结果输入http://jsonlint.com/会返回错误.删除"特殊"周围的双引号可验证字符串.

从PHP创建JSON字符串并正确转义它以在JS文件中使用的最佳方法是什么?

小智 40

另一种方法是使用htmlspecialchars对引号进行编码:

$json_array = array(
    'title' => 'Example string\'s with "special" characters'
);

$json_decode = htmlspecialchars(json_encode($json_array), ENT_QUOTES, 'UTF-8');
Run Code Online (Sandbox Code Playgroud)

  • 不会把```转换成```` (13认同)
  • 一个名为htmlspecialchars的函数如何适合将字符串编码为JSON? (3认同)
  • 好的提示,它的工作很好用`data -`属性(html5):)谢谢!+1 (2认同)

Gré*_*une 28

我成功地做到了这一点:

$json = str_replace("\u0022","\\\\\"",json_encode( $phpArray,JSON_HEX_QUOT)); 
Run Code Online (Sandbox Code Playgroud)

json_encode()默认情况下将转义"\".但它仍然是错误的JSON json.PARSE().所以通过添加选项JSON_HEX_QUOT,json_encode()将替换"\u0022. json.PARSE()仍然不会喜欢\u0022.所以,这时我们就需要更换\u0022\\".该\\\\\"转义\\".

注意:如果您有javascript单引号问题,可以添加JSON_HEX_APOS用unicode HEX值替换单引号的选项.

例如: json_encode( $phpArray, JSON_HEX_APOS|JSON_HEX_QUOT ));

  • PHP:$ encodedData = json_encode($ phpArray,JSON_HEX_APOS | JSON_HEX_QUOT); JS:JSON.parse('<?php echo $ encodedData?>'); 完善. (3认同)
  • 对我来说,问题似乎是 JSON.parse() 首先解码 unicode 转义字符,然后解析字符串。通过解码,它将 \u0022 转换为双引号,从而使 json 字符串无效。\\\u0022 确实有效,为此我需要在 php 中用 \\" 转义双引号,然后再执行 json_encode()。基本上,这就是这个答案的作用。 (2认同)

小智 19

json_encode($json_array, JSON_HEX_QUOT); 自php 5.3起使用:http://php.net/manual/en/json.constants.php

  • 或者如果您使用单引号,则为“json_encode($json_array, JSON_HEX_APOS)”。或者更好的是,同时执行“json_encode($json_array, JSON_HEX_QUOT | JSON_HEX_APOS)”。 (4认同)

Chr*_*rle 6

来自http://www.php.net/manual/en/function.json-encode.php#100565

也就是说,引用"将产生无效的JSON,但这只是一个问题,如果你使用json_encode()并且只是期望PHP神奇地逃脱你的引号.你需要自己逃避.

  • 所以你不能指望json_encode产生一个有效的json?我不会雇用这个开发人员 (68认同)
  • 这个答案虽然被标记为已被接受,但却没有回答这个问题.OP问:从PHP创建JSON字符串并正确转义它以在JS文件中使用的最佳方法是什么?这个答案说你需要自己逃避,但没有提供最好的方法来做到这一点. (38认同)

小智 6

这是一个处理单引号和双引号的解决方案:

<?php
$php_data = array("title"=>"Example string's with \"special\" characters");

$escaped_data = json_encode($php_data, JSON_HEX_QUOT | JSON_HEX_APOS);
$escaped_data = str_replace(['\u0022', '\u0027'], ["\\\"", "\\'"], $escaped_data);
?>
<script>
// no need to use JSON.parse()...
var js_data = <?= $escaped_data ?>;
alert(js_data.title); // should alert `Example string's with "special" characters`
</script>
Run Code Online (Sandbox Code Playgroud)