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

时间:2011-09-18 15:18:16

标签: php escaping json double-quotes

我正在从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/会返回错误。删除“特殊”周围的双引号可验证字符串。

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

7 个答案:

答案 0 :(得分:35)

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

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

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

答案 1 :(得分:25)

我成功地做到了这一点:

$json = str_replace("\u0022","\\\\\"",json_encode( $phpArray,JSON_HEX_QUOT)); 
默认情况下,

json_encode()会将"转义为\"。但json.PARSE()的JSON仍然是错误的。因此,通过添加选项JSON_HEX_QUOTjson_encode()会将"替换为\u0022json.PARSE()仍然不喜欢\u0022。因此,我们需要将\u0022替换为\\"\\\\\"已转义\\"

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

ex:json_encode( $phpArray, JSON_HEX_APOS|JSON_HEX_QUOT ));

答案 2 :(得分:18)

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

答案 3 :(得分:9)

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

  

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

我遇到了挑战,用户无意输入€,有些用户使用双引号定义其内容。 我调整了此页面上的一些答案以及其他答案,最终定义了我的小解决方法

$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);
}

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

答案 6 :(得分:0)

脚本错误不在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>