json_encode () entgeht Schrägstrichen

164

Ich ziehe JSON von Instagram:

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

Analysieren Sie dann Variablen in ein PHP-Array, um die Daten neu zu strukturieren, und codieren Sie die Datei neu und zwischenspeichern Sie sie:

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

Wenn ich die Cache-Datei öffne, werden alle meine Schrägstriche "/" maskiert:

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

Ich habe bei meinen Suchanfragen json_encode()festgestellt, dass dies automatisch geschieht. Gibt es eine Möglichkeit, dies zu deaktivieren?

Michael C.
quelle
2
Es ist optional: "Die Zeichen, die maskiert werden müssen: Anführungszeichen, umgekehrter Solidus und die Steuerzeichen (U + 0000 bis U + 001F). Jedes Zeichen kann maskiert werden."
ThiefMaster

Antworten:

283

Gibt es eine Möglichkeit, es zu deaktivieren?

Ja, Sie müssen nur die JSON_UNESCAPED_SLASHESFlagge verwenden.

! Wichtig vorher gelesen: https://stackoverflow.com/a/10210367/367456 (wissen, womit Sie es zu tun haben - kennen Sie Ihren Feind)

json_encode($str, JSON_UNESCAPED_SLASHES);

Wenn Sie nicht über PHP 5.4 verfügen, wählen Sie eine der vielen vorhandenen Funktionen aus und passen Sie sie an Ihre Bedürfnisse an, z. B. http://snippets.dzone.com/posts/show/7487 (archivierte Kopie) .

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

Beispielausgabe:

"http:\/\/www.example.com\/"
"http://www.example.com/"
hakre
quelle
2
Diese Antwort ist dankbar, aber JSON Encode als Standard sollten Sie als maskiert belassen und dann am empfangenden Ende die entkommenen PHPs rückgängig machen strip_slashesund für JS phpjs.org/functions/stripslashes
Barkermn01
1
@MartinBarker: Dies war möglicherweise nur bei PHP 5.2.1 ein Problem: 3v4l.org/0AahO - Der JSON ist in beiden Fällen gültig.
hakre
@MartinBarker Aus irgendeinem seltsamen Grund wurde der Schrägstrich auf der Empfangsseite nicht mit Stripslashes (), str_replace () oder preg_replace () entfernt. Bevor ich diese Antwort gefunden habe, habe ich einen Weg gehackt, um den Schrägstrich zu entfernen, indem ich urlencode () verwendet und dann% 2F ersetzt habe. Ich benutze PHP7 unter Windows. Ich bin mir nicht sicher, ob es irgendwo einen Fehler gibt, aber magische Anführungszeichen sind nicht einmal in PHP7 enthalten, daher ist es besser, den Hackery zu vermeiden, indem Sie einfach die Schrägstriche deaktivieren.
Sami Fouad
@SamiFouad: Selbst mit dem Schrägstrich ist JSON korrekt und sollte keine Probleme verursachen (es sei denn, der Empfänger verarbeitet JSON nicht ordnungsgemäß, siehe json.org , insbesondere die char- Beschreibung auf der rechten Seite, die explizit \/als gültige Escape-Sequenz für bezeichnet /). Siehe auch stackoverflow.com/a/10210367/367456 .
hakre
Hässliches PHP! Das JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHESmuss die Standardoption sein, nicht (seltsam) ... Wie sagt man es PHP-Entwicklern?
Peter Krauss
46

Ja , aber nicht - es ist eine gute Sache, Schrägstrichen zu entkommen . Wenn Sie JSON in <script>Tags verwenden, ist es erforderlich, dass </script>das Skript-Tag an einer beliebigen Stelle - auch innerhalb einer Zeichenfolge - beendet wird.

Je nachdem, wo der JSON verwendet wird, ist er nicht erforderlich, kann jedoch ignoriert werden.

DiebMaster
quelle
5
Entfernt Javascript automatisch die Backslashes, wenn es den JSON einzieht, oder muss ich dies angeben?
Michael C.
5
Es wird automatisch damit umgehen. Wie in vielen anderen Sprachen lässt das Entkommen von Zeichen ohne besondere Bedeutung in der Sprache diese Zeichen einfach in Ruhe.
ThiefMaster
19
@ MichaelC. In JSON entspricht der Zeichenfolgenwert "\/"genau dem Zeichenfolgenwert "/"- und ein funktionierender JSON-Parser behandelt ihn als solchen. Die gleiche Regel gilt für Javascript-Zeichenfolgen, sodass das Füttern von JSON als Javascript-Code ebenfalls keine Probleme verursacht. Ich bin überrascht, dass PHP sogar die JSON_UNESCAPED_SLASHESFlagge hat.
Esailija
4
Was aber, wenn man die Daten in JSON codiert und sie dann in einer Datenbankspalte speichert? Wenn das Programm über einen Mechanismus verfügt, um Zeichen aus Gründen der Datenbank zu maskieren, wäre diese Funktion dann nicht sehr unpraktisch, da die Schrägstriche jetzt doppelt maskiert werden?
Xavier_Ex
5
Das Speichern von JSON in Skript-Tags ohne einen Codierungsschritt unter der Annahme, dass die JSON-Implementierung Schrägstrichen entgangen ist, scheint eine Vorgehensweise zu sein, die Sie mit Sicherheit irgendwann beißen wird.
Ryan
4

Auf der anderen Seite hatte ich ein Problem mit PHPUNIT, bei dem behauptet wurde, URLs seien in einer URL enthalten oder gleich dieser, die json_encoded war -

meine erwartete:

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

würde verschlüsselt werden zu:

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

Wenn Sie einen Vergleich durchführen müssen, transformieren Sie die URL mit:

addcslashes($url, '/')

erlaubt für die richtige Ausgabe während meiner Vergleiche.

Staffeln
quelle
1

Ich musste auf eine Situation als solche stoßen, und einfach auf die

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

hat für mich gearbeitet.

Anton De Rose
quelle
0

Sie müssen keinen Schrägstrichen entkommen! In HTML5 und JS können sowohl Anführungszeichen als auch Anführungszeichen verwendet werden. In JSON gebe ich also Folgendes ein:

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

Siehe Website ev.bingo als Arbeitsbeispiel: "v4": ["Audi e-tron Q4 Sportback nutzt eine modulare elektrische Antriebsplattform MEPP, die vom Volkswagen Konzern gemeinsam genutzt wird"],

mcc
quelle