Передайте строку PHP в переменную JavaScript (и экранируйте новые строки) [дубликат]
На этот вопрос уже есть ответ здесь:
Каков самый простой способ кодирования строки PHP для вывода в переменную JavaScript?
У меня есть строка PHP, которая включает кавычки и новые строки. Мне нужно, чтобы содержимое этой строки было помещено в Переменная JavaScript.
Обычно я бы просто создавал свой JavaScript в файле PHP, а-ля:
<script>
var myvar = "<?php echo $myVarValue;?>";
</script>
Однако это не работает, когда $myVarValue
содержит кавычки или новые строки.
14 answers
Расширение чужого ответа:
<script>
var myvar = <?php echo json_encode($myVarValue); ?>;
</script>
Использование json_encode() требует:
- PHP 5.2.0 или выше
-
$myVarValue
кодируется как UTF-8 (или US-ASCII, конечно)
Поскольку UTF-8 поддерживает полный Юникод, его должно быть безопасно конвертировать на лету.
Обратите внимание, что, поскольку json_encode
экранирует косые черты, даже строка, содержащая </script>
, будет безопасно экранирована для печати с помощью блока сценария.
Закодируйте его с помощью JSON
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>
Однако ссылка , которую опубликовал Михавиттман, предполагает, что существуют некоторые незначительные различия в кодировке. Функция PHP 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'\\")));
}
Специальные символы Html
Описание
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 '>'
Вы можете вставить его в скрытый DIV, а затем назначить innerHTML DIV вашей переменной JavaScript. Вам не нужно беспокоиться о том, чтобы чего-то избежать. Просто убедитесь, что не вставляете туда сломанный HTML.
Вы могли бы попробовать
<script type="text/javascript">
myvar = unescape('<?=rawurlencode($myvar)?>');
</script>
Не запускайте его, хотя 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)); }
Я не уверен, является ли это плохой практикой или нет, но моя команда и я использовали смешанное решение html, JS и php. Мы начинаем со строки PHP, которую мы хотим вставить в переменную JS, давайте назовем ее:
$someString
Далее мы используем элементы скрытой формы на странице и задаем их значение в виде строки:
<form id="pagePhpVars" method="post">
<input type="hidden" name="phpString1" id="phpString1" value="'.$someString.'" />
</form>
Тогда это простой вопрос определения JS var через document.getElementById:
<script type="text/javascript" charset="UTF-8">
var moonUnitAlpha = document.getElementById('phpString1').value;
</script>
Теперь вы можете использовать переменную JS "moonunitalpha" в любом месте, где вы хотите ее захватить Строковое значение PHP. Похоже, это действительно хорошо работает для нас. Посмотрим, выдержит ли он интенсивное использование.
Если вы используете механизм шаблонов для создания своего HTML, то вы можете заполнить его тем, чем когда-либо захотите!
Проверьте XTemplates. Это хороший, с открытым исходным кодом, легкий движок шаблонов.
Ваш HTML/JS там будет выглядеть так:
<script>
var myvar = {$MyVarValue};
</script>