it-swarm.cn

PHP JSON字符串,对JS输出进行转义双引号

我正在从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文件使用的最佳方法是什么?

38
Luke

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

就是说,引号“将产生无效的JSON,但这仅是一个问题,如果您使用的是json_encode(),并且只希望PHP可以神奇地转义引号。您需要自行进行转义。

9
Chris Eberle

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

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

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

我成功做到了:

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

json_encode()默认情况下会从_"_到_\"_转义。但是json.PARSE()的JSON仍然是错误的。因此,通过添加选项_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 ));

25
Grégoire Lafortune

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

18
Effectiva

这是解决单引号和双引号的解决方案:

<?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", "\\\"", $escaped_data );
$escaped_data = str_replace("\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>
2
appcropolis

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

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

我曾经挑战过用户无辜地输入€,有些用户使用双引号定义了他们的内容。我调整了此页面上的几个答案以及其他答案,最终定义了我的小解决方法

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

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

0
Maxximum Rider