web-dev-qa-db-ja.com

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

From http://www.php.net/manual/en/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

Php 5.3以降のjson_encode($json_array, JSON_HEX_QUOT);を使用してください: http://php.net/manual/en/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