Передать строку PHP в переменную JavaScript (и экранировать символы новой строки)
Какой самый простой способ закодировать строку PHP для вывода в переменную JavaScript?
У меня есть строка PHP, которая включает в себя кавычки и новые строки. Мне нужно, чтобы содержимое этой строки было помещено в переменную JavaScript.
Обычно я просто строю свой JavaScript в PHP-файле, например:
<script>
var myvar = "<?php echo $myVarValue;?>";
</script>
Тем не менее, это не работает, когда $myVarValue
содержит цитаты или переводы строк.
14 ответов
Расширяя чужой ответ:
<script>
var myvar = <?php echo json_encode($myVarValue); ?>;
</script>
Использование json_encode() требует:
- PHP 5.2.0 или выше
$myVarValue
кодируется как UTF-8 (или, конечно, US-ASCII)
Так как UTF-8 поддерживает полный Unicode, его можно безопасно конвертировать на лету.
Обратите внимание, что, потому что json_encode
избегает косой черты, даже строки, содержащей </script>
будет безопасно сохранен для печати с помощью блока скриптов.
function escapeJavaScriptText($string)
{
return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\")));
}
У меня была похожая проблема, и я понимаю, что следующее является лучшим решением:
<script>
var myvar = decodeURIComponent("<?php echo rawurlencode($myVarValue); ?>");
</script>
Тем не менее, ссылка, которую разместил micahwittman, предполагает, что есть некоторые незначительные различия в кодировке. РНР rawurlencode()
функция должна соответствовать RFC 1738, хотя с Javascript, похоже, не было таких усилий decodeURIComponent()
,
Параноидальная версия: избегать каждого персонажа.
function javascript_escape($str) {
$new_str = '';
$str_len = strlen($str);
for($i = 0; $i < $str_len; $i++) {
$new_str .= '\\x' . sprintf('%02x', ord(substr($str, $i, 1)));
}
return $new_str;
}
РЕДАКТИРОВАТЬ: причина, почему json_encode()
может быть неуместным то, что иногда нужно предотвращать "
быть сгенерированным, например
<div onclick="alert(???)" />
<script>
var myVar = <?php echo json_encode($myVarValue); ?>;
</script>
или же
<script>
var myVar = <?= json_encode($myVarValue) ?>;
</script>
Приведенное ниже решение Мики сработало для меня, так как сайт, который я должен был настроить, не был в UTF-8, поэтому я не мог использовать json; Я бы проголосовал, но мой представитель недостаточно высок.
function escapeJavaScriptText($string)
{
return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\")));
}
Не запускайте его addslashes()
; если вы находитесь в контексте страницы HTML, анализатор HTML все еще может видеть </script>
тег, даже середина строки, и предположим, что это конец JavaScript:
<?php
$value = 'XXX</script><script>alert(document.cookie);</script>';
?>
<script type="text/javascript">
var foo = <?= json_encode($value) ?>; // Use this
var foo = '<?= addslashes($value) ?>'; // Avoid, allows XSS!
</script>
Не. Используйте Ajax, вставьте его в
data-*
атрибуты в вашем HTML или что-то еще значимое. Использование встроенных сценариев делает ваши страницы больше, и может быть небезопасным или все же позволяет пользователям разрушать макет, если…... вы делаете более безопасную функцию:
function inline_json_encode($obj) { return str_replace('<!--', '<\!--', json_encode($obj)); }
Вы можете вставить его в скрытый DIV, а затем присвоить innerHTML DIV вашей переменной JavaScript. Вам не нужно беспокоиться о побеге. Только будьте уверены, что не поместите туда битый HTML.
Вы могли бы попробовать
<script type="text/javascript">
myvar = unescape('<?=rawurlencode($myvar)?>');
</script>
htmlspecialchars
Описание
string htmlspecialchars ( string $string [, int $quote_style [, string $charset [, bool $double_encode ]]] )
Некоторые символы имеют особое значение в HTML и должны быть представлены объектами HTML, если они хотят сохранить свои значения. Эта функция возвращает строку с некоторыми из этих преобразований; сделанные переводы являются наиболее полезными для повседневного веб-программирования. Если вам требуется перевод всех сущностей символов HTML, используйте взамен htmlentities().
Эта функция полезна для предотвращения того, чтобы пользовательский текст содержал разметку HTML, например, на доске объявлений или в приложении гостевой книги.
Выполненные переводы:
* '&' (ampersand) becomes '&'
* '"' (double quote) becomes '"' when ENT_NOQUOTES is not set.
* ''' (single quote) becomes ''' only when ENT_QUOTES is set.
* '<' (less than) becomes '<'
* '>' (greater than) becomes '>'
Если вы используете шаблонизатор для создания своего HTML, вы можете заполнить его чем угодно!
Проверьте XTemplates. Это хороший, легкий, открытый движок шаблонов.
Ваш HTML/JS там будет выглядеть так:
<script>
var myvar = {$MyVarValue};
</script>
Я не уверен, является ли это плохой практикой или нет, но моя команда и я использовали смешанное решение html, JS и php. Мы начнем со строки PHP, которую мы хотим вставить в переменную JS, давайте вызовем ее:
$someString
Затем мы используем скрытые элементы формы внутри страницы, и их значение устанавливается в виде строки:
<form id="pagePhpVars" method="post">
<input type="hidden" name="phpString1" id="phpString1" value="'.$someString.'" />
</form>
Тогда просто определить JS-переменную через document.getElementById:
<script type="text/javascript" charset="UTF-8">
var moonUnitAlpha = document.getElementById('phpString1').value;
</script>
Теперь вы можете использовать переменную JS "moonUnitAlpha" везде, где вы хотите получить это строковое значение PHP. Это, кажется, работает очень хорошо для нас. Посмотрим, выдержит ли оно интенсивное использование.