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ファイルで使用するために適切にエスケープする最良の方法は何ですか?
From http://www.php.net/manual/en/function.json-encode.php#100565
とはいえ、引用符は無効なJSONを生成しますが、これはjson_encode()を使用していてPHPが引用符を魔法のようにエスケープすることを期待している場合にのみ問題になります。 。
別の方法は、 htmlspecialchars を使用して引用符をエンコードすることです。
$json_array = array(
'title' => 'Example string\'s with "special" characters'
);
$json_decode = htmlspecialchars(json_encode($json_array), ENT_QUOTES, 'UTF-8');
私はこれをうまくやった:
_$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 ));
Php 5.3以降のjson_encode($json_array, JSON_HEX_QUOT);
を使用してください: http://php.net/manual/en/json.constants.php
これは、一重引用符と二重引用符を処理するソリューションです。
<?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>
私はこの問題に遭遇しましたが、実際の問題は、実際のJSONデータを吐き出す前に適切なapplication/jsonヘッダーを追加するのを忘れたことでした。
header('Content-Type: application/json');
ユーザーが無邪気に€を入力し、一部のユーザーがコンテンツを定義するために二重引用符を使用することに挑戦しました。このページと他のページからいくつかの回答を微調整して、小さな小さな回避策を最終的に定義しました
$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);
}
誰か/誰かがそれを改善するのに役立つことを願っています。