json_encode (), що уникає косої риски вперед


165

Я тягну JSON з Instagram:

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

Потім аналізуємо змінні в масив PHP для реструктуризації даних, після чого повторно кодуємо та кешуємо файл:

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

Коли я відкриваю файл кешу, всі мої передні нахили вперед / / перетворюються:

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

Я збираюся з моїх пошуків, який json_encode()автоматично робить це ... чи є спосіб відключити це?


2
Необов’язково: "символи, які потрібно уникнути: лапки, зворотний солідус та контрольні символи (від U + 0000 до U + 001F). Будь-який символ може бути уникнути."
ThiefMaster

Відповіді:


285

чи є спосіб її відключити?

Так, вам потрібно використовувати лише JSON_UNESCAPED_SLASHESпрапор.

! важливо прочитати раніше: https://stackoverflow.com/a/10210367/367456 (знайте, з чим ви маєте справу - знайте свого ворога)

json_encode($str, JSON_UNESCAPED_SLASHES);

Якщо у вас немає PHP 5.4 під рукою, виберіть одну з багатьох існуючих функцій та змініть їх під свої потреби, наприклад http://snippets.dzone.com/posts/show/7487 (заархівована копія) .

Приклад демонстрації

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

Приклад Вихід:

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

2
Ця відповідь є вдячною, але JSON Encode як стандартна, ви повинні залишити її як уникнуту, а потім у відповідній частині скасувати скачуючі php- strip_slashesта , а для JS phpjs.org/functions/stripslashes
Barkermn01

1
@MartinBarker: Можливо, це була проблема лише з PHP 5.2.1: 3v4l.org/0AahO - JSON діє в обох випадках.
хакре

@MartinBarker З якоїсь дивної причини нахил вперед не знімає на приймальному кінці стрибками (), str_replace () або preg_replace (). Перш ніж я знайшов цю відповідь, я зламав спосіб позбутися косої риски за допомогою urlencode (), а потім замінивши% 2F. Я використовую PHP7 у Windows. Не впевнений, чи є десь помилка, але магічні котирування навіть не включені до PHP7, тому краще уникнути хакерів, просто відключивши риски.
Самі Фуад

@SamiFouad: Навіть з нарізаною косою це правильний JSON і не повинен створювати жодних проблем (якщо тільки приймач не керує JSON належним чином, див. Json.org , особливо опис char з правого боку, який явно називає \/дійсною послідовністю відходу /) , див. також stackoverflow.com/a/10210367/367456 .
хакре

Потворний PHP! параметр JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHESповинен бути типовим, не (дивним) варіантом ... Як сказати це розробникам php?
Пітер Краусс

45

Так , але не - уникнути косої частини вперед - це добре . При використанні JSON внутрішніх <script>тегів це потрібно, як і </script>де завгодно, навіть усередині рядка, закінчиться тегом сценарію.

Залежно від того, де використовується JSON, це не обов'язково, але його можна сміливо ігнорувати.


5
Так що JavaScript автоматично зніме звороту косу рису, коли вона потягнеться в json, чи це щось мені потрібно вказати?
Майкл К.

5
Він автоматично впорається з цим. Як і в багатьох інших мовах, втечі символів без особливого значення в мові просто залишають цих символів у спокої.
ThiefMaster

19
@MichaelC. У JSON значення рядка "\/"точно таке ж значення рядка "/"- і працюючий аналізатор JSON буде вважати його таким. Це ж правило стосується і рядків javascript, тому при подачі JSON як коду JavaScript також не виникне проблем. Я здивований, що у PHP навіть є JSON_UNESCAPED_SLASHESпрапор.
Есаїлія

4
Але що робити, якщо кодувати дані в JSON, а потім зберігати їх у стовпчик бази даних? Якщо програма має якийсь механізм для виходу із символів заради баз даних, чи не буде ця функція дуже незручною, оскільки тепер косої риски подвоєні?
Xavier_Ex

5
Скидання JSON у теги скриптів без кроку кодування з припущенням, що реалізація JSON уникнула косої риси, схоже на практику, яка, безумовно, зрештою вас вкусить.
Райан

3

З іншого боку, у мене виникла проблема з PHPUNIT, що стверджує, що URL-адреси містились у або дорівнює URL-адресі, яка була json_encoded -

моє очікуване:

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

буде закодовано:

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

Якщо вам потрібно порівняти, перетворивши URL-адресу, використовуючи:

addcslashes($url, '/')

дозволено для належного результату під час моїх порівнянь.


0

Мені довелося зіткнутися з ситуацією як такою, і просто

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

зробив для мене роботу.


-1

Вам не потрібно бігти вперед косою рисою! HTML5 та JS дозволяє використовувати "лапки", а також "лапки". Отже, в JSON I введіть:

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

Дивіться веб-сайт ev.bingo як робочий приклад: "v4": ["Audi e-tron Q4 Sportback повністю використовує модульну електричну двигунну платформу MEPP, яку поділяють серед Volkswagen Group"],

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.