json_encode () escapando barras diagonales

164

Estoy sacando a JSON de Instagram:

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

Luego analiza las variables en una matriz PHP para reestructurar los datos, luego vuelve a codificar y almacenar en caché el archivo:

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

Cuando abro el archivo de caché se escapan todas mis barras diagonales "/":

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

De mis búsquedas deduzco que json_encode()automáticamente hace esto ... ¿hay alguna forma de desactivarlo?

Michael C.
fuente
2
Es opcional: "los caracteres que se deben escapar: comillas, sólidos inversos y los caracteres de control (U + 0000 a U + 001F). Se puede escapar cualquier carácter".
ThiefMaster

Respuestas:

284

¿hay alguna manera de deshabilitarlo?

Sí, solo necesitas usar la JSON_UNESCAPED_SLASHESbandera.

! lectura importante antes: https://stackoverflow.com/a/10210367/367456 (sepa con lo que está tratando, conozca a su enemigo)

json_encode($str, JSON_UNESCAPED_SLASHES);

Si no tiene PHP 5.4 a mano, elija una de las muchas funciones existentes y modifíquelas según sus necesidades, por ejemplo, http://snippets.dzone.com/posts/show/7487 (copia archivada) .

Demo de ejemplo

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

Salida de ejemplo:

"http:\/\/www.example.com\/"
"http://www.example.com/"
hakre
fuente
2
Esta respuesta es gratificante, pero JSON Encode como estándar debe dejarlo como escapado y luego, en el extremo de recepción, deshacer los php que escapan strip_slashesy para JS phpjs.org/functions/stripslashes
Barkermn01
1
@ MartinBarker: Esto podría haber sido un problema solo con PHP 5.2.1: 3v4l.org/0AahO : el JSON es válido en ambos casos.
Hakre
@MartinBarker Por alguna extraña razón, la barra diagonal no se despojó del extremo receptor con stripslashes (), str_replace () o preg_replace (). Antes de encontrar esta respuesta, pirateé una forma de deshacerme de la barra usando urlencode () y luego reemplazando% 2F. Estoy usando PHP7 en Windows. No estoy seguro de si hay algún error en algún lugar, pero las comillas mágicas ni siquiera están incluidas en PHP7, por lo que es mejor evitar la piratería simplemente deshabilitando las barras.
Sami Fouad
@SamiFouad: Incluso con la recortó, es JSON correcta y no debe crear ningún problema (a menos que el receptor no está manejando correctamente JSON, ver json.org , especialmente el carbón descripción en la banda derecha que nombres explícitamente \/como secuencia de escape válida para /) , consulte stackoverflow.com/a/10210367/367456 también.
hakre
PHP feo! la JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHESopción debe ser predeterminada, no (extraña) ... ¿Cómo decirlo a los desarrolladores de php?
Peter Krauss
45

, pero no, escapar de las barras diagonales es algo bueno . Cuando se usa JSON dentro de las <script>etiquetas, es necesario ya que un </script>lugar, incluso dentro de una cadena, finalizará la etiqueta del script.

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

ThiefMaster
fuente
55
Entonces, ¿JavaScript eliminará automáticamente las barras diagonales inversas cuando tire de json, o esto es algo que necesito especificar?
Michael C.
55
Lo manejará automáticamente. Al igual que en muchos otros idiomas, los caracteres que escapan sin un significado especial en el idioma solo dejan esos caracteres solos.
ThiefMaster
19
@MichaelC. En JSON, el valor de la cadena "\/"es exactamente el mismo que el valor de la cadena "/", y un analizador JSON en funcionamiento lo tratará como tal. La misma regla se aplica a las cadenas de JavaScript, por lo que alimentar JSON como un código de JavaScript tampoco tendrá problemas. Me sorprende que PHP incluso tenga la JSON_UNESCAPED_SLASHESbandera.
Esailija
44
Pero, ¿qué pasa si uno codifica los datos en JSON y luego los almacena en una columna de base de datos? Si el programa tiene algún mecanismo para escapar de los caracteres por el bien de la base de datos, ¿no sería esta característica muy inconveniente ya que ahora las barras se han escapado dos veces?
Xavier_Ex
55
Volcar JSON en etiquetas de script sin un paso de codificación, suponiendo que la implementación de JSON estaba escapando de las barras, parece una práctica que seguramente lo morderá.
Ryan
3

Por otro lado, estaba teniendo un problema con PHPUNIT afirmando que las URL estaban contenidas o eran iguales a una URL que estaba codificada por json_

mi esperado:

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

estaría codificado para:

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

Si necesitas hacer una comparación, transforma la url usando:

addcslashes($url, '/')

permitió la salida adecuada durante mis comparaciones.

Escuadrones
fuente
0

Tuve que enfrentar una situación como tal, y simplemente, el

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

funcionó para mí

Anton De Rose
fuente
-1

¡No necesitas escapar de las barras diagonales! HTML5 y JS permiten usar 'comillas y comillas ". Así que en JSON escribo:

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

Consulte el sitio web ev.bingo como ejemplo de trabajo: "v4": ["Audi e-tron Q4 Sportback utiliza completamente una plataforma de propulsión eléctrica modular MEPP, que se comparte entre el Grupo Volkswagen"],

mcc
fuente