PHP JSON字符串,为JS输出转义双引号

Posted

技术标签:

【中文标题】PHP JSON字符串,为JS输出转义双引号【英文标题】:PHP JSON String, escape Double Quotes for JS output 【发布时间】:2011-11-19 17:10:17 【问题描述】:

我正在从 php 数组创建一个 JSON 字符串。我使用json_encode()对其进行了编码。

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

$data = json_encode( $data );

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

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

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

console.log( jsonData );

这导致输出:

 "title":"Example string's with "special" characters" 

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

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

【问题讨论】:

任何阅读此 Q 及其答案的人:请注意,在问题中,json 字符串 data 在传递给 parseJSON 之前在 JS 中已更改。通过调用wp_localize_scriptreplace。恕我直言,这并没有说明 json_encode 或 parseJSON 存在问题。 【参考方案1】:

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

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

$json_decode = htmlspecialchars(json_encode($json_array), ENT_QUOTES, 'UTF-8');

【讨论】:

不会将" 转换为" 吗? 好的提示,data- 属性 (html5) 很好用 :) 谢谢! +1 一个名为 htmlspecialchars 的函数怎么可能适合将字符串编码为 JSON? 所以如果你正在做一个echo '<div>' . json_encode($some_data); . '</div>'。这可能是正确的答案。我在 json_encode 之前错误地对数组中的某些字段执行了 htmlspecialchars,这导致了许多令人沮丧的错误,其中一个将我带到了这里。 JSON.parse('!! htmlspecialchars(json_encode($array), ENT_QUOTES, 'UTF-8') !!'.replace(/"/g,'"'))【参考方案2】:

我成功地做到了:

$json = str_replace("\u0022","\\\\\"",json_encode( $phpArray,JSON_HEX_QUOT)); 

json_encode() 默认会转义 "\" 。但对于json.PARSE(),它仍然是错误的 JSON。因此,通过添加选项JSON_HEX_QUOTjson_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 vars 中的双引号 " 会导致问题。这种方法对我有用。谢谢! 对我来说,问题似乎是 JSON.parse() 首先解码 unicode 转义字符,然后解析字符串。通过解码,它将 \u0022 转换为双引号,从而使 json 字符串无效。 \\u0022 确实有效,为此我需要在 php 中使用 \\" 转义双引号,然后再执行 json_encode()。基本上,这个答案就是这样做的。【参考方案3】:

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

【讨论】:

我正在格式化自己的 json,并且只插入诸如 "\"key\":".json_encode($value)."" 之类的值,其中 $value 是带引号的字符串。这是对我有用的最简单的解决方案。 JSON.parse(x) 在这种情况下完美运行。 json_encode($json_array, JSON_HEX_APOS),如果您使用的是单引号。或者更好的是,两者都做json_encode($json_array, JSON_HEX_QUOT | JSON_HEX_APOS)【参考方案4】:

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

<?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>

【讨论】:

【参考方案5】:

我刚刚遇到了这个问题,实际问题是我在吐出实际 JSON 数据之前忘记添加正确的 application/json 标头。

header('Content-Type: application/json');

【讨论】:

【参考方案6】:

我遇到了一些用户无辜地输入 € 以及一些使用双引号来定义其内容的挑战。 我从这个页面和其他页面调整了几个答案,最终定义了我的小解决方法

$products = array($ofDirtyArray);
if($products !=null) 
    header("Content-type: application/json");
    header('Content-Type: charset=utf-8');
    array_walk_recursive($products, function(&$val) 
        $val = html_entity_decode(htmlentities($val, ENT_QUOTES, "UTF-8"));
    );
    echo json_encode($products,  JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);

我希望它可以帮助某人/某人改进它。

【讨论】:

【参考方案7】:

错误出现在不在 HTML 标记中的脚本上。

<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<pre><?php print_r($_POST??'') ?></pre>

<form method="POST">
    <input type="text" name="name"><br>
    <input type="email" name="email"><br>
    <input type="time" name="time"><br>
    <input type="date" name="date"><br>
    <input type="hidden" name="id"><br>
    <textarea name="detail"></textarea>
    <input type="submit" value="Submit"><br>
</form>
<?php 
/* data */
$data = [
            'name'=>'loKESH"'."'\\\\",
            'email'=>'imvsrajput@demo.demo',
            'time'=>date('H:i:00'),
            'date'=>date('Y-m-d'),
            'detail'=>'Try this var_dump(0=="ZERO") \\ \\"'." ' \\\\    ",
            'id'=>123,
        ];
?>
<span style="display: none;" class="ajax-data"><?=json_encode($_POST??$data)?></span>
<script type="text/javascript">
    /* Error */
    // var json = JSON.parse('<?=json_encode($data)?>');
    /* Error solved */
    var json = JSON.parse($('.ajax-data').html());
    console.log(json)
    /* automatically assigned value by name attr */
    for(x in json)
        $('[name="'+x+'"]').val(json[x]);
    
</script>

【讨论】:

以上是关于PHP JSON字符串,为JS输出转义双引号的主要内容,如果未能解决你的问题,请参考以下文章

php 接收到json双引号前有转义符\,怎么去除

java正则转义json中双引号

(实用篇)PHP中单引号与双引号的区别分析

如何利用fastjson将JSON格式的字符串转换为Map,再返回至前端成为js对象

PHP教程:PHP中单引号与双引号的区别分析

PHP前台提交json,双一号被转义了,json有一万字符,JS无法替换处理