json_encode () échappement des barres obliques

165

Je tire JSON d'Instagram:

$instagrams = json_decode($response)->data;

Ensuite, analyse des variables dans un tableau PHP pour restructurer les données, puis recodage et mise en cache du fichier:

file_put_contents($cache,json_encode($results));

Lorsque j'ouvre le fichier cache, toutes mes barres obliques "/" sont échappées:

http:\/\/distilleryimage4.instagram.com\/410e7...

Je récupère de mes recherches que json_encode()cela fait automatiquement cela ... y a-t-il un moyen de le désactiver?

Michael C.
la source
2
Il est facultatif: «les caractères à échapper: guillemets, solidus inversé et les caractères de contrôle (U + 0000 à U + 001F). Tout caractère peut être échappé».
ThiefMaster

Réponses:

285

Y a-t'il une manière de le désactiver?

Oui, il vous suffit d'utiliser le JSON_UNESCAPED_SLASHESdrapeau.

! lecture importante avant: https://stackoverflow.com/a/10210367/367456 (sachez à quoi vous avez affaire - connaissez votre ennemi)

json_encode($str, JSON_UNESCAPED_SLASHES);

Si vous n'avez pas PHP 5.4 à portée de main, choisissez l'une des nombreuses fonctions existantes et modifiez-la selon vos besoins, par exemple http://snippets.dzone.com/posts/show/7487 (copie archivée) .

Exemple de démonstration

<?php
/*
 * Escaping the reverse-solidus character ("/", slash) is optional in JSON.
 *
 * This can be controlled with the JSON_UNESCAPED_SLASHES flag constant in PHP.
 *
 * @link http://stackoverflow.com/a/10210433/367456
 */    

$url = 'http://www.example.com/';

echo json_encode($url), "\n";

echo json_encode($url, JSON_UNESCAPED_SLASHES), "\n";

Exemple de sortie:

"http:\/\/www.example.com\/"
"http://www.example.com/"
hakre
la source
2
Cette réponse est gracieuse, mais JSON Encode en standard, vous devez le laisser comme échappé, puis dans la fin de réception, annuler les php qui s'échappent strip_slasheset pour JS phpjs.org/functions/stripslashes
Barkermn01
1
@MartinBarker: Cela aurait pu être un problème uniquement avec PHP 5.2.1: 3v4l.org/0AahO - Le JSON est valide dans les deux cas.
hakre
@MartinBarker Pour une raison étrange, la barre oblique n'a pas été supprimée à l'extrémité de réception avec striplashes (), str_replace () ou preg_replace (). Avant de trouver cette réponse, j'ai piraté ensemble un moyen de se débarrasser de la barre oblique en utilisant urlencode (), puis en remplaçant% 2F. J'utilise PHP7 sur Windows. Je ne sais pas s'il y a un bogue quelque part, mais les guillemets magiques ne sont même pas inclus dans PHP7, il est donc préférable d'éviter le piratage en désactivant simplement les barres obliques.
Sami Fouad
@SamiFouad: Même avec le slashed, c'est JSON correct et ne devrait pas créer de problèmes (à moins que le récepteur ne gère pas JSON correctement, voir json.org , en particulier la description char sur le côté droit qui nomme explicitement \/comme séquence d'échappement valide pour /) , voir stackoverflow.com/a/10210367/367456 également.
hakre
Moche PHP! l' JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHESoption doit être par défaut, pas (étrange) ... Comment le dire aux développeurs php?
Peter Krauss
45

Oui , mais ne le faites pas - échapper aux barres obliques est une bonne chose . Lorsque vous utilisez JSON à l'intérieur des <script>balises, il est nécessaire car un </script>n'importe où - même à l'intérieur d'une chaîne - terminera la balise de script.

Selon l'endroit où le JSON est utilisé, ce n'est pas nécessaire, mais il peut être ignoré en toute sécurité.

ThiefMaster
la source
5
Donc, javascript supprimera-t-il automatiquement les barres obliques inverses lorsqu'il extrait le json, ou ce que je dois spécifier?
Michael C.
5
Il le gérera automatiquement. Comme dans de nombreuses autres langues, échapper des caractères sans signification particulière dans la langue laisse simplement ces caractères seuls.
ThiefMaster
19
@MichaelC. Dans JSON, la valeur de la chaîne "\/"est exactement la même que celle de la chaîne "/"- et un analyseur JSON fonctionnant la traitera comme telle. La même règle s'applique aux chaînes javascript, donc alimenter JSON en tant que code javascript ne posera pas non plus de problèmes. Je suis surpris que PHP ait même le JSON_UNESCAPED_SLASHESdrapeau.
Esailija
4
Mais que se passe-t-il si l'on encodait les données en JSON puis les stockait dans une colonne de base de données? Si le programme a un mécanisme pour échapper des caractères pour la base de données, cette fonctionnalité ne serait-elle pas très gênante puisque maintenant les barres obliques sont double-échappées?
Xavier_Ex
5
Décharger JSON dans des balises de script sans étape d'encodage en supposant que l'implémentation JSON échappait des barres obliques semble être une pratique qui finira par vous mordre.
Ryan
3

D'un autre côté, j'avais un problème avec PHPUNIT affirmant que les URL étaient contenues ou égales à une URL qui était json_encoded -

mon attendu:

http://localhost/api/v1/admin/logs/testLog.log

serait encodé en:

http:\/\/localhost\/api\/v1\/admin\/logs\/testLog.log

Si vous avez besoin de faire une comparaison, transformez l'URL en utilisant:

addcslashes($url, '/')

permis la sortie correcte lors de mes comparaisons.

Escadrons
la source
0

J'ai dû rencontrer une situation en tant que telle, et simplement

str_replace("\/","/",$variable)

a fonctionné pour moi.

Anton De Rose
la source
-1

Vous n'avez pas besoin d'échapper aux barres obliques! HTML5 et JS permettent d'utiliser des guillemets "ainsi que des" guillemets. Donc, en JSON, je tape:

    "index4":{"<a href='http://example.com'>example</a>"}

Voir le site Web ev.bingo comme exemple de travail: "v4": ["Audi e-tron Q4 Sportback utilise pleinement une plate-forme de propulsion électrique modulaire MEPP, qui est partagée par le groupe Volkswagen"],

mcc
la source