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/"
hakre
источник
2
Этот ответ хорош, но JSON Encode как стандарт, вы должны оставить его как сбежавший, а затем в конце получения отменить побег php strip_slashesи для JS phpjs.org/functions/stripslashes
Barkermn01
1
@MartinBarker: Это могло быть проблемой только с PHP 5.2.1: 3v4l.org/0AahO - JSON действителен в обоих случаях.
Хакре
@MartinBarker По какой-то странной причине косая черта не была зачищена на приемном конце с помощью stripslashes (), str_replace () или preg_replace (). Прежде чем я нашел этот ответ, я взломал способ избавиться от косой черты, используя urlencode (), а затем заменив% 2F. Я использую PHP7 на Windows. Не уверен, есть ли где-нибудь ошибка, но магические кавычки даже не включены в PHP7, поэтому лучше избегать взлома, просто отключив слеш.
Сами Фуад
@SamiFouad: Даже с косой чертой это правильный JSON, и он не должен создавать никаких проблем (если получатель не обрабатывает JSON должным образом, см. Json.org , особенно описание char справа, которое явно называется \/допустимой escape-последовательностью для /) см. также stackoverflow.com/a/10210367/367456 .
Хакре
Уродливый PHP! JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHESдолжен быть по умолчанию, нет (странно) вариант ... Как сказать это PHP-разработчиков?
Питер Краусс
45

Да , но не надо - избегать слешей - это хорошо . При использовании JSON внутри <script>тегов необходимо как </script>угодно - даже внутри строки - заканчивать тег скрипта.

В зависимости от того, где используется JSON, это необязательно, но его можно смело игнорировать.

ThiefMaster
источник
5
Так будет ли javascript автоматически удалять обратную косую черту, когда он тянет в json, или это то, что мне нужно указать?
Майкл С.
5
Это автоматически обработает это. Как и во многих других языках, экранирование символов без специального значения в языке просто оставляет эти символы в покое.
ThiefMaster
19
@MichaelC. В JSON строковое значение "\/"в точности совпадает со строковым значением "/"- и работающий анализатор JSON будет рассматривать его как таковой. То же правило применяется к строкам javascript, поэтому подача JSON как кода javascript также не будет иметь проблем. Я удивлен, что у PHP даже есть JSON_UNESCAPED_SLASHESфлаг.
Esailija
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 я набираю:

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

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

МСС
источник