web-dev-qa-db-fra.com

PHP Chaîne JSON, échapper à Double Quotes pour la sortie JS

Je crée une chaîne JSON à partir d'un tableau PHP. Je l'ai encodée à l'aide de json_encode().

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

$data = json_encode( $data );

$data Est localisé à l'aide de wp_localize_script() et est accessible via une variable globale data.

Dans le fichier JS, je peux accéder aux informations comme suit:

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

console.log( jsonData );

Il en résulte une sortie de:

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

La saisie de ce résultat dans http://jsonlint.com/ renvoie une erreur. La suppression des guillemets autour de "spécial" valide la chaîne.

Quelle est la meilleure façon de créer une chaîne JSON à partir de PHP et de l'échapper correctement pour l'utiliser dans un fichier JS?

38
Luke

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

Cela dit, les guillemets "produiront un JSON invalide, mais ce n'est un problème que si vous utilisez json_encode () et attendez-vous simplement à PHP pour échapper comme par magie vos guillemets. Vous devez faire l'échappement vous-même .

9
Chris Eberle

Une autre façon serait de coder les guillemets en utilisant 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

Je viens de le faire avec succès:

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

json_encode() par défaut échappera de " à \". Mais c'est toujours faux JSON pour json.PARSE(). Ainsi, en ajoutant l'option JSON_HEX_QUOT, json_encode() remplacera " Par \u0022. json.PARSE() n'aimera toujours pas \u0022. Nous devons donc remplacer \u0022 Par \\". Le \\\\\" Est échappé \\".

REMARQUE: vous pouvez ajouter l'option JSON_HEX_APOS Pour remplacer le guillemet simple par la valeur unicode HEX si vous avez un problème de guillemet simple javascript.

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

25

Utilisez json_encode($json_array, JSON_HEX_QUOT); depuis php 5.3: http://php.net/manual/en/json.constants.php

18
Effectiva

Il s'agit d'une solution qui prend en charge les guillemets simples et doubles:

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

Je viens de rencontrer ce problème et le problème réel est que j'ai oublié d'ajouter un en-tête application/json approprié avant de cracher les données JSON réelles.

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

J'ai eu un défi avec les utilisateurs entrant innocemment € et certains utilisant des guillemets doubles pour définir leur contenu. J'ai modifié quelques réponses de cette page et d'autres pour enfin définir mon petit petit contournement

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

J'espère que cela aide quelqu'un/quelqu'un à l'améliorer.

0
Maxximum Rider