json_encode () lolos dari garis miring ke depan

164

Saya menarik JSON dari Instagram:

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

Kemudian mem-parsing variabel ke dalam array PHP untuk merestrukturisasi data, kemudian meng-encode ulang dan menyimpan file:

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

Ketika saya membuka file cache semua garis miring "/" saya sedang melarikan diri:

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

Saya mengumpulkan dari pencarian saya yang json_encode()secara otomatis melakukan ini ... apakah ada cara untuk menonaktifkannya?

Michael C.
sumber
2
Ini opsional: "karakter yang harus diloloskan: tanda kutip, reverse solidus, dan karakter kontrol (U + 0000 hingga U + 001F). Karakter apa pun dapat melarikan diri."
ThiefMaster

Jawaban:

284

apakah ada cara untuk menonaktifkannya?

Ya, Anda hanya perlu menggunakan JSON_UNESCAPED_SLASHESbendera.

! Penting dibaca sebelumnya: https://stackoverflow.com/a/10210367/367456 (tahu apa yang Anda hadapi - kenal musuh Anda)

json_encode($str, JSON_UNESCAPED_SLASHES);

Jika Anda tidak memiliki PHP 5.4, pilih salah satu dari banyak fungsi yang ada dan modifikasi sesuai kebutuhan Anda, misalnya http://snippets.dzone.com/posts/show/7487 (salinan arsip) .

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

Contoh Output:

"http:\/\/www.example.com\/"
"http://www.example.com/"
hakre
sumber
2
Jawaban ini adalah parut tetapi JSON Encode sebagai standar Anda harus meninggalkannya sebagai lolos dan kemudian pada akhir menerima membatalkan php yang lolos strip_slashesdan untuk JS phpjs.org/functions/stripslashes
Barkermn01
1
@ MartinBarker: Ini mungkin masalah hanya dengan PHP 5.2.1: 3v4l.org/0AahO - JSON berlaku dalam kedua kasus.
hakre
@ MartinBarker Untuk beberapa alasan aneh forward slash tidak mengupas pada sisi penerima dengan stripslash (), str_replace () atau preg_replace (). Sebelum saya menemukan jawaban ini, saya meretas bersama cara untuk menghapus slash dengan menggunakan urlencode () dan kemudian mengganti% 2F. Saya menggunakan PHP7 di Windows. Tidak yakin apakah ada bug di suatu tempat, tetapi kutipan sihir bahkan tidak termasuk dalam PHP7 sehingga lebih baik untuk menghindari peretasan dengan hanya menonaktifkan garis miring.
Sami Fouad
@SamiFouad: Bahkan dengan garis miring, JSON sudah benar dan tidak akan menimbulkan masalah (kecuali jika penerima tidak menangani JSON dengan benar, lihat json.org , terutama deskripsi char di sisi kanan yang secara eksplisit menyebut \/urutan melarikan diri yang valid untuk /) , lihat juga stackoverflow.com/a/10210367/367456 .
hakre
PHP yang jelek! opsi JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHESharus default, bukan (aneh) ... Bagaimana mengatakannya kepada php-developer?
Peter Krauss
45

Ya , tapi jangan - melarikan diri ke garis miring adalah hal yang baik . Saat menggunakan <script>tag JSON di dalam, itu perlu di </script>mana saja - bahkan di dalam string - akan mengakhiri tag skrip.

Tergantung di mana JSON digunakan itu tidak perlu, tetapi dapat diabaikan dengan aman.

Pencuri
sumber
5
Jadi javascript akan menghapus backslash secara otomatis ketika menarik json, atau ini sesuatu yang perlu saya tentukan?
Michael C.
5
Secara otomatis akan menanganinya. Seperti di banyak bahasa lain, melarikan diri karakter tanpa makna khusus dalam bahasa hanya meninggalkan karakter itu sendiri.
ThiefMaster
19
@MichaelC. Di JSON nilai string "\/"persis sama dengan nilai string "/"- dan parser JSON yang berfungsi akan memperlakukannya seperti itu. Aturan yang sama berlaku untuk string javascript, jadi memberi makan JSON sebagai kode javascript juga tidak akan memiliki masalah. Saya terkejut PHP bahkan punya JSON_UNESCAPED_SLASHESbendera.
Esailija
4
Tetapi bagaimana jika seseorang mengkodekan data ke dalam JSON dan kemudian menyimpannya ke dalam kolom basis data? Jika program memiliki beberapa mekanisme untuk melarikan diri karakter demi database, bukankah fitur ini sangat merepotkan karena sekarang garis miring sedang diloloskan ganda?
Xavier_Ex
5
Membuang JSON ke tag skrip tanpa langkah penyandian dengan asumsi bahwa implementasi JSON lolos dari garis miring sepertinya merupakan praktik yang pada akhirnya akan menggigit Anda.
Ryan
3

Di sisi lain, saya mengalami masalah dengan PHPUNIT yang menyatakan bahwa url terkandung atau sama dengan url yang json_encoded -

yang saya harapkan:

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

akan dikodekan ke:

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

Jika Anda perlu melakukan perbandingan, mentransformasikan url menggunakan:

addcslashes($url, '/')

diizinkan untuk output yang tepat selama perbandingan saya.

Skuadron
sumber
0

Saya harus menghadapi situasi seperti itu, dan hanya, itu

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

tidak bekerja untuk saya.

Anton De Rose
sumber
-1

Anda tidak perlu melarikan diri ke garis miring! HTML5 dan JS memungkinkan untuk menggunakan tanda kutip 'serta tanda kutip. Jadi di JSON I ketik:

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

Lihat situs web ev.bingo sebagai contoh kerja: "v4": ["Audi e-tron Q4 Sportback sepenuhnya menggunakan Platform Propulsi Listrik Modular MEPP, yang dibagikan di antara Grup Volkswagen"],

mcc
sumber