Я предполагаю, что данные для передачи - это строка.
Как отмечают другие комментаторы, AJAX - одно из возможных решений, но недостатки превосходят плюсы: он имеет задержку, и это сложнее (для этого требуется код для получения значения как на стороне сервера, так и на стороне клиента), когда должна быть достаточно простая функция экранирования.
Итак, мы вернулись к экранированию. json_encode($string)
работает , если вы сначала кодируете исходную строку как UTF-8, если это еще не так, потому что для json_encode
требуются данные UTF-8. Если строка находится в ISO-8859-1, вы можете просто использовать json_encode(utf8_encode($string))
; в противном случае вы всегда можете использовать iconv
для выполнения преобразования.
Но есть большая проблема. Если вы используете его в событиях, вам нужно запустить htmlspecialchars()
в результате, чтобы сделать правильный код. И тогда вы должны быть осторожны, чтобы использовать двойные кавычки для включения события или всегда добавлять ENT_QUOTES
в htmlspecialchars. Например:
<?php
$myvar = "I'm in \"UTF-8\" encoding and I have <script>script tags</script> & ampersand!";
// Fails:
//echo '<body onload="alert(', json_encode($myvar), ');">';
// Fails:
//echo "<body onload='alert(", json_encode($myvar), ");'>";
// Fails:
//echo "<body onload='alert(", htmlspecialchars(json_encode($myvar)), ");'>";
// Works:
//echo "<body onload='alert(", htmlspecialchars(json_encode($myvar), ENT_QUOTES), ");'>";
// Works:
echo '<body onload="alert(', htmlspecialchars(json_encode($myvar)), ');">';
echo "</body>";
Однако вы не можете использовать htmlspecialchars
для обычного JS-кода (код, заключенный в теги <script>
... </script>
). Это позволяет использовать эту функцию, подверженную ошибкам, забыв htmlspecialchars
результат при записи кода события.
Можно написать функцию, которая не имеет этой проблемы, и может использоваться как в событиях и в регулярном JS-коде, если вы включаете свои события всегда в одинарные кавычки или всегда в двойные кавычки. Вот мое предложение, требующее, чтобы они были в двойных кавычках (что я предпочитаю):
<?php
// Optionally pass the encoding of the source string, if not UTF-8
function escapeJSString($string, $encoding = 'UTF-8')
{
if ($encoding != 'UTF-8')
$string = iconv($encoding, 'UTF-8', $string);
$flags = JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS|JSON_HEX_QUOT|JSON_UNESCAPED_SLASHES;
$string = substr(json_encode($string, $flags), 1, -1);
return "'$string'";
}
Для функции требуется PHP 5.4+. Пример использования:
<?php
$myvar = "I'm in \"UTF-8\" encoding and I have <script>script tags</script> & ampersand!";
// Note use of double quotes to enclose the event definition!
echo '<body onload="alert(', escapeJSString($myvar), ');">';
// Example with regular code:
echo '<script>alert(', escapeJSString($myvar), ');</script>';
echo '</body>';