2012-04-18 24 views
122

Estoy tirando JSON de Instagram:json_encode() escapa barras diagonales

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

A continuación, analizar las variables en una matriz de PHP para reestructurar los datos, a continuación, volver a codificar y almacenar en caché el archivo:

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

al abrir el archivo de caché toda mi barras diagonales "/" están siendo escaparon:

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

De acuerdo con mis búsquedas, json_encode() hace esto automáticamente ... ¿hay alguna manera de desactivarlo?

+1

Es opcional: "los caracteres que se deben escapar: comillas, solidus reverso y los caracteres de control (U + 0000 a través de U + 001F). Se puede escapar cualquier carácter." – ThiefMaster

Respuesta

187

¿hay alguna manera de desactivarlo?

Sí, sólo es necesario utilizar la bandera JSON_UNESCAPED_SLASHES. !

importante leer antes de: https://stackoverflow.com/a/10210367/367456 (saber lo que está tratando con - conocer al enemigo)

json_encode($str, JSON_UNESCAPED_SLASHES); 

Si usted no tiene PHP 5.4 a mano, escoger uno de las muchas funciones existentes y las modifica a sus necesidades, por ejemplo http://snippets.dzone.com/posts/show/7487 (archived copy).

Example Demo

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

Ejemplo de Salida:

"http:\/\/www.example.com\/" 
"http://www.example.com/" 
+0

Estaba buscando horas para esto, por qué mi base64 string insing json está roto ... ¡gracias! –

+0

Esta es la respuesta, pero JSON Encode como estándar debe dejarlo como escapado y luego en el extremo de recuperación deshacer el escape php's 'strip_slashes' y para JS http://phpjs.org/functions/stripslashes/ –

+1

@MartinBarker: Esto podría ha sido un problema solo con PHP 5.2.1: http://3v4l.org/0AahO - El JSON es válido en ambos casos. – hakre

31

Yes, pero no - escaping forward slashes is a good thing. Cuando se utiliza JSON dentro de las etiquetas <script>, es necesario como </script> en cualquier lugar, incluso dentro de una cadena, se terminará la etiqueta del script.

Dependiendo de dónde se use el JSON no es necesario, pero se puede ignorar de forma segura.

+4

Entonces, ¿javascript eliminará automáticamente las barras invertidas cuando tire de la json, o esto algo que necesito especificar? –

+4

Lo manejará automáticamente. Al igual que en muchos otros idiomas, escapar de los personajes sin un significado especial en el idioma simplemente deja a los personajes en paz. – ThiefMaster

+16

@MichaelC. En JSON, el valor de cadena '" \/"' es exactamente el mismo que el valor de cadena '"/"' - y un analizador JSON que funcione lo tratará como tal. La misma regla se aplica a las cadenas de javascript, por lo que alimentar a JSON como un código de JavaScript tampoco tendrá problemas. Me sorprende que PHP incluso tenga el indicador 'JSON_UNESCAPED_SLASHES'. – Esailija

2

En la otra cara, estaba teniendo un problema con las URL PHPUnit afirmando estaba contenida en o igual a una dirección URL que se json_encoded -

mi esperado:

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

se codificaría a:

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

Si necesita hacer una comparación, la transformación de la url usando:

addcslashes($url, '/')

permitidos para la salida correcta durante mis comparaciones.

Cuestiones relacionadas