eğik çizgilerden kaçan json_encode ()


165

JSON'u Instagram'dan çekiyorum:

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

Ardından, verileri yeniden yapılandırmak için değişkenleri bir PHP dizisine ayrıştırma, sonra dosyayı yeniden kodlama ve önbelleğe alma:

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

Önbellek dosyasını açtığımda tüm "/" eğik çizgileri kaçıyor:

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

Aramalarımdan bunu json_encode()otomatik olarak yapan bir araya getiriyorum ... devre dışı bırakmanın bir yolu var mı?


2
Opsiyoneldir: "Kaçması gereken karakterler: tırnak işareti, ters katı ve kontrol karakterleri (U + 0000 - U + 001F). Herhangi bir karakter kaçabilir."
ThiefMaster

Yanıtlar:


285

devre dışı bırakmanın bir yolu var mı?

Evet, sadece JSON_UNESCAPED_SLASHESbayrağı kullanmanız gerekiyor .

! önemli önce okuyun: https://stackoverflow.com/a/10210367/367456 (neyle uğraştığınızı bilin - düşmanınızı tanıyın)

json_encode($str, JSON_UNESCAPED_SLASHES);

PHP 5.4 elinizde yoksa, mevcut birçok işlevden birini seçin ve ihtiyaçlarınıza göre değiştirin, örneğin http://snippets.dzone.com/posts/show/7487 (arşivlenmiş kopya) .

Örnek 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";

Örnek Çıktı:

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

2
Bu cevap rendeleyin ancak JSON Encode standart olarak kaçmış olarak bırakmalısınız ve daha sonra geri alma sonunda kaçan php'leristrip_slashes ve JS phpjs.org/functions/stripslashes
Barkermn01 23:04

1
@MartinBarker: Bu sadece PHP 5.2.1 ile ilgili bir sorun olabilir: 3v4l.org/0AahO - JSON her iki durumda da geçerlidir.
hakre

@MartinBarker Garip bir nedenle eğik çizgi (), str_replace () veya preg_replace () ile eğik çizgi, alıcı uçtan sıyırmadı. Bu cevabı bulmadan önce, urlencode () kullanarak ve sonra% 2F değiştirerek eğik çizgiden kurtulmanın bir yolunu hackledim. Windows'ta PHP7 kullanıyorum. Bazı yerlerde bir hata olup olmadığından emin değilim, ancak sihirli tırnaklar PHP7'ye bile dahil edilmediğinden, sadece eğik çizgileri devre dışı bırakarak hackery'den kaçınmak daha iyidir.
Sami Fouad

@SamiFouad: Kesik çizgili olsa bile, doğru JSON'dur ve herhangi bir sorun yaratmamalıdır (alıcı JSON'u düzgün işlemiyorsa , bkz. Json.org , özellikle sağ taraftaki geçerli çıkış sırası olarak açıkça adlandırılan char açıklaması ) , bkz. stackoverflow.com/a/10210367/367456 . \//
hakre

Çirkin PHP! JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHESolmalı varsayılan değil (garip) seçeneği ... Nasıl php-geliştiriciler bunu söylemek?
Peter Krauss

45

Evet , ama yapma - eğik çizgilerden kaçmak iyi bir şey . JSON <script>etiketlerinin </script>içinde kullanılırken, bir dizede bile olsa, komut dosyası etiketinin sona ereceği her yerde gereklidir .

JSON'un kullanıldığı yere bağlı olarak gerekli değildir, ancak güvenli bir şekilde göz ardı edilebilir.


5
Javascript, json'u çektiğinde ters eğik çizgileri otomatik olarak kaldıracak mı yoksa bu, belirtmem gereken bir şey mi?
Michael C.18

5
Otomatik olarak işleyecektir. Diğer birçok dilde olduğu gibi, dilde özel bir anlamı olmayan karakterlerden kaçmak sadece bu karakterleri yalnız bırakır.
ThiefMaster

19
@MichaelC. JSON'da dize değeri "\/", dize değeriyle tam olarak aynıdır "/"- ve çalışan bir JSON ayrıştırıcısı buna böyle davranır. Javascript dizeleri için de aynı kural geçerlidir, bu nedenle JSON'u javascript kodu olarak beslemek de herhangi bir sorun yaşamaz. PHP JSON_UNESCAPED_SLASHESbayrağı bile şaşırttı .
Esailija

4
Peki ya verileri JSON'a kodlayıp sonra bir veritabanı sütununda saklıyorsa ne olur? Program veritabanı uğruna karakter kaçmak için bazı mekanizma varsa, şimdi eğik çizgiler kaçtı beri bu özellik çok rahatsız edici olmaz mı?
Xavier_Ex

5
JSON uygulamasının eğik çizgilerden kaçtığı varsayımı üzerine kodlama adımı olmadan JSON'u komut dosyası etiketlerine dökmek, sonunda sizi ısırmaya kesin bir uygulama gibi görünüyor.
Ryan

3

Flip tarafında, URL'leri json_encoded olan bir url içerdiği veya eşit olduğunu iddia eden PHPUNIT ile ilgili bir sorun yaşıyordum -

beklediğim:

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

şu şekilde kodlanır:

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

Bir karşılaştırma yapmanız gerekiyorsa, URL'yi aşağıdakileri kullanarak dönüştürün:

addcslashes($url, '/')

benim karşılaştırmalar sırasında doğru çıktı için izin verdi.


0

Böyle bir durumla karşılaşmam gerekiyordu ve

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

benim için çalıştı.


-1

Eğik çizgilerden kaçmanıza gerek yok! HTML5 ve JS, "tırnak işareti" yanı sıra "tırnak işareti" kullanılmasına izin verir. JSON I'de şunu yazın:

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

Çalışma örneği olarak ev.bingo'nun web sitesine bakın: "v4": ["Audi e-tron Q4 Sportback, Volkswagen Grubu arasında paylaşılan bir MEPP Modüler Elektrikli Tahrik Platformu'nu tamamen kullanıyor"],

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.