PHP JSON String, escape Double Quotes для вывода JS
Я создаю строку JSON из массива PHP. Я закодировал его с помощью json_encode()
.
$data = array(
'title' => 'Example string\ with "special" characters'
);
$data = json_encode( $data );
$data
локализуется с помощью wp_localize_script()
и доступен через глобальную переменную data
.
В JS файле я могу получить доступ к следующей информации:
var data = data.replace( /"/g, '"' ),
jsonData = jQuery.parseJSON( data );
console.log( jsonData );
В результате получается результат:
{ "title":"Example string with "special" characters" }
Ввод этого результата в http://jsonlint.com/ возвращает ошибку. Удаление двойных кавычек вокруг "special" проверяет строку.
Каков наилучший способ создать строку JSON из PHP и правильно ее избежать для использования в JS файле?
Ответы
Ответ 1
Из http://www.php.net/manual/en/function.json-encode.php#100565
Тем не менее, цитаты "будут приводить к недействительным JSON, но это только проблема, если вы используете json_encode() и просто ожидаете, что PHP будет магически избегать ваших котировок. Вам нужно сделать эскалацию самостоятельно.
Ответ 2
Другим способом было бы закодировать кавычки, используя htmlspecialchars:
$json_array = array(
'title' => 'Example string\ with "special" characters'
);
$json_decode = htmlspecialchars(json_encode($json_array), ENT_QUOTES, 'UTF-8');
Ответ 3
Я успешно только что сделал это:
$json = str_replace("\u0022","\\\\\"",json_encode( $phpArray,JSON_HEX_QUOT));
json_encode()
по умолчанию будет экранировать "
to \"
. Но это все-таки неправильно JSON для json.PARSE()
. Таким образом, добавив опцию JSON_HEX_QUOT
, json_encode()
заменит "
на \u0022
. json.PARSE()
все равно не понравится \u0022
. Итак, нам нужно заменить \u0022
на \\"
. \\\\\"
сбежал \\"
.
ПРИМЕЧАНИЕ: вы можете добавить опцию JSON_HEX_APOS
чтобы заменить одиночную кавычку на значение HEX
JSON_HEX_APOS
если у вас есть JSON_HEX_APOS
с одинарными JSON_HEX_APOS
в JavaScript.
например: json_encode( $phpArray, JSON_HEX_APOS|JSON_HEX_QUOT ));
Ответ 4
Использовать json_encode($json_array, JSON_HEX_QUOT);
начиная с версии 5.3: http://php.net/manual/en/json.constants.php
Ответ 5
Это решение, которое заботится о одинарных и двойных кавычках:
<?php
$php_data = array("title"=>"Example string with \"special\" characters");
$escaped_data = json_encode( $php_data, JSON_HEX_QUOT|JSON_HEX_APOS );
$escaped_data = str_replace("\u0022", "\\\"", $escaped_data );
$escaped_data = str_replace("\u0027", "\\'", $escaped_data );
?>
<script>
// no need to use JSON.parse()...
var js_data = <?= $escaped_data ?>;
alert(js_data.title); // should alert 'Example string with "special" characters'
</script>
Ответ 6
Я просто столкнулся с этой проблемой, и фактическая проблема заключалась в том, что я забыл добавить правильный заголовок приложения /json, прежде чем выплевывать фактические данные JSON.
header('Content-Type: application/json');
Ответ 7
У меня была проблема с пользователями, невинно вводящими €, а некоторые использовали двойные кавычки для определения своего контента. Я подправил пару ответов с этой страницы и других, чтобы, наконец, определить мой маленький маленький обходной путь
$products = array($ofDirtyArray);
if($products !=null) {
header("Content-type: application/json");
header('Content-Type: charset=utf-8');
array_walk_recursive($products, function(&$val) {
$val = html_entity_decode(htmlentities($val, ENT_QUOTES, "UTF-8"));
});
echo json_encode($products, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);
}
Я надеюсь, что это помогает кому-то/кому-то это улучшить.