web-dev-qa-db-fra.com

json_encode () échappant des barres obliques

Je tire JSON d'Instagram:

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

Ensuite, analyser les variables dans un tableau PHP pour restructurer les données, puis réencoder et mettre en cache le fichier:

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

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

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

D'après mes recherches, json_encode() le fait automatiquement ... y a-t-il un moyen de le désactiver?

153
Michael C.

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

Oui, vous devez uniquement utiliser l'indicateur JSON_UNESCAPED_SLASHES.

! important à lire avant: https://stackoverflow.com/a/10210367/367456 (savez à quoi vous avez affaire avec - connais ton 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 en fonction de 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/"
257
hakre

Oui , mais pas - échapper des barres obliques est une bonne chose . Lorsque vous utilisez JSON dans les balises <script>, il est nécessaire car </script> n'importe où - même dans une chaîne - termine 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é.

43
ThiefMaster

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

mon prévu:

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

serait encodé à:

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

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

addcslashes($url, '/')

permis pour la sortie appropriée lors de mes comparaisons.

4
Squadrons