json_encode () in fuga da barre rovesciate


164

Sto estraendo JSON da Instagram:

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

Quindi analizza le variabili in un array PHP per ristrutturare i dati, quindi ricodifica e memorizzazione nella cache del file:

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

Quando apro il file della cache, tutte le mie barre "/" vengono eliminate:

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

Raccolgo dalle mie ricerche che lo fanno json_encode()automaticamente ... c'è un modo per disabilitarlo?


2
È facoltativo: "i caratteri che devono essere sfuggiti: virgolette, punto inverso e caratteri di controllo (da U + 0000 a U + 001F). È possibile sfuggire a qualsiasi carattere".
ThiefMaster,

Risposte:


284

c'è un modo per disabilitarlo?

Sì, devi solo usare la JSON_UNESCAPED_SLASHESbandiera.

! importante leggere prima: https://stackoverflow.com/a/10210367/367456 (sapere con cosa hai a che fare - conosci il tuo nemico)

json_encode($str, JSON_UNESCAPED_SLASHES);

Se non hai PHP 5.4 a portata di mano, scegli una delle tante funzioni esistenti e modificale in base alle tue esigenze, ad esempio http://snippets.dzone.com/posts/show/7487 (copia archiviata) .

Demo di esempio

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

Esempio di output:

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

2
Questa risposta è grata, ma JSON Encode come standard dovresti lasciarlo come fuggito e quindi alla fine dell'annullamento annullare i php in fuga strip_slashese per JS phpjs.org/functions/stripslashes
Barkermn01

1
@MartinBarker: questo potrebbe essere stato un problema solo con PHP 5.2.1: 3v4l.org/0AahO - Il JSON è valido in entrambi i casi.
Hacre,

@MartinBarker Per qualche strana ragione, la barra in avanti non si spogliava sull'estremità di ricezione con striplash (), str_replace () o preg_replace (). Prima di trovare questa risposta, ho combinato un modo per liberarmi della barra usando urlencode () e sostituendo% 2F. Sto usando PHP7 su Windows. Non sono sicuro che ci sia un bug in qualche luogo, ma le citazioni magiche non sono nemmeno incluse in PHP7, quindi è meglio evitare l'hacking disabilitando semplicemente le barre.
Sami Fouad,

@SamiFouad: Anche con la barra, è JSON corretto e non dovrebbe creare alcun problema (a meno che il ricevitore non stia gestendo correttamente JSON, consultare json.org , in particolare la descrizione del carattere sul lato destro che indica esplicitamente \/come sequenza di escape valida per /) , vedi anche stackoverflow.com/a/10210367/367456 .
Hakre,

Brutto PHP! l' JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHESopzione deve essere predefinita, non (strana) ... Come dirlo agli sviluppatori php?
Peter Krauss,

45

, ma non farlo: sfuggire alle barre in avanti è una buona cosa . Quando si usano i <script>tag JSON all'interno , è necessario che </script>ovunque - anche all'interno di una stringa - si termini il tag script.

A seconda di dove viene utilizzato JSON non è necessario, ma può essere tranquillamente ignorato.


5
Quindi javascript rimuoverà automaticamente le barre rovesciate quando si inserisce il json, o questo qualcosa che devo specificare?
Michael C.,

5
Lo gestirà automaticamente. Come in molte altre lingue, la fuga di caratteri senza un significato speciale nella lingua lascia solo quei caratteri da soli.
ThiefMaster,

19
@MichaelC. In JSON il valore di stringa "\/"è esattamente uguale al valore di stringa "/"e un parser JSON funzionante lo tratterà come tale. La stessa regola si applica alle stringhe javascript, quindi l'alimentazione di JSON come codice javascript non avrà problemi. Sono sorpreso che PHP abbia persino la JSON_UNESCAPED_SLASHESbandiera.
Esailija,

4
Ma cosa succede se si codifica i dati in JSON e li si archivia in una colonna del database? Se il programma avesse qualche meccanismo per sfuggire ai personaggi per il bene del database, questa funzione non sarebbe molto scomoda da ora che le barre vengono sfuggite due volte?
Xavier_Ex,

5
Scaricare JSON nei tag script senza un passaggio di codifica presupponendo che l'implementazione JSON stia sfuggendo alle barre sembra una pratica che alla fine ti morderà.
Ryan,

3

Il rovescio della medaglia, stavo avendo un problema con PHPUNIT affermando che gli URL erano contenuti o uguali a un URL che era codificato json -

il mio previsto:

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

sarebbe codificato in:

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

Se devi fare un confronto, trasformando l'URL usando:

addcslashes($url, '/')

permesso l'output corretto durante i miei confronti.


0

Ho dovuto affrontare una situazione in quanto tale, e semplicemente, il

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

ha funzionato per me.


-1

Non è necessario sfuggire alle barre in avanti! HTML5 e JS consentono di utilizzare le virgolette e le "virgolette. Quindi in JSON digito:

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

Vedi il sito web ev.bingo come esempio funzionante: "v4": ["Audi e-tron Q4 Sportback utilizza pienamente una piattaforma di propulsione elettrica modulare MEPP, condivisa tra il Gruppo Volkswagen"],

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.