Передайте строку PHP в переменную JavaScript (и экранируйте новые строки) [дубликат]


На этот вопрос уже есть ответ здесь:

Каков самый простой способ кодирования строки PHP для вывода в переменную JavaScript?

У меня есть строка PHP, которая включает кавычки и новые строки. Мне нужно, чтобы содержимое этой строки было помещено в Переменная JavaScript.

Обычно я бы просто создавал свой JavaScript в файле PHP, а-ля:

<script>
  var myvar = "<?php echo $myVarValue;?>";
</script>

Однако это не работает, когда $myVarValue содержит кавычки или новые строки.

Author: Ry-, 2008-10-03

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>, будет безопасно экранирована для печати с помощью блока сценария.

 473
Author: bobwienholt, 2015-11-13 14:53:30

Закодируйте его с помощью JSON

 25
Author: Javier, 2008-10-03 18:33:50
function escapeJavaScriptText($string)
{
    return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\")));
}
 19
Author: micahwittman, 2008-10-03 18:38:29

У меня была аналогичная проблема, и я понимаю, что следующее является лучшим решением:

<script>
    var myvar = decodeURIComponent("<?php echo rawurlencode($myVarValue); ?>");
</script>

Однако ссылка , которую опубликовал Михавиттман, предполагает, что существуют некоторые незначительные различия в кодировке. Функция PHP rawurlencode() должна соответствовать RFC 1738, в то время как, похоже, таких усилий с Javascript не предпринималось decodeURIComponent().

 17
Author: pr1001, 2009-01-14 13:33:39

Параноидальная версия: Побег от каждого отдельного персонажа.

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(???)" />
 9
Author: giraff, 2015-11-08 12:45:29
<script>
var myVar = <?php echo json_encode($myVarValue); ?>;
</script>

Или

<script>
var myVar = <?= json_encode($myVarValue) ?>;
</script>
 5
Author: Kld, 2013-01-25 14:46:47

Решение Мики, приведенное ниже, сработало для меня, так как сайт, который я должен был настроить, не был в UTF-8, поэтому я не мог использовать json; Я бы проголосовал за него, но моя репутация недостаточно высока.

function escapeJavaScriptText($string) 
{ 
    return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\"))); 
} 
 3
Author: SLaks, 2011-05-18 21:25:34

Специальные символы Html

Описание

string htmlspecialchars ( string $string [, int $quote_style [, string $charset [, bool $double_encode ]]] )

Некоторые символы имеют особое значение в HTML и должны быть представлены объектами HTML, если они хотят сохранить свои значения. Эта функция возвращает строку с некоторыми из этих выполненных преобразований; выполненные переводы являются наиболее полезными для повседневного веб-программирования. Если вам требуется перевести все сущности символов HTML, используйте вместо этого htmlentities().

Эта функция полезна для предотвращения предоставленный пользователем текст, содержащий HTML-разметку, например, на доске объявлений или в приложении гостевой книги.

Выполненные переводы:

* '&' (ampersand) becomes '&amp;'
* '"' (double quote) becomes '&quot;' when ENT_NOQUOTES is not set.
* ''' (single quote) becomes '&#039;' only when ENT_QUOTES is set.
* '<' (less than) becomes '&lt;'
* '>' (greater than) becomes '&gt;'

Http://ca.php.net/htmlspecialchars

 2
Author: Chris MacDonald, 2008-10-03 18:37:46

Вы можете вставить его в скрытый DIV, а затем назначить innerHTML DIV вашей переменной JavaScript. Вам не нужно беспокоиться о том, чтобы чего-то избежать. Просто убедитесь, что не вставляете туда сломанный HTML.

 2
Author: Diodeus - James MacFarlane, 2008-10-03 18:39:14

Вы могли бы попробовать

<script type="text/javascript">
    myvar = unescape('<?=rawurlencode($myvar)?>');
</script>
 2
Author: Jacob, 2008-10-03 18:50:19

Не запускайте его, хотя 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>
 2
Author: Craig Francis, 2014-01-08 18:06:17
  1. Не надо. Используйте Ajax, поместите его в атрибуты data-* в свой HTML или что-то еще значимое. Использование встроенных сценариев делает ваши страницы больше, и может быть небезопасным или все еще позволять пользователям портить макет, если только...

  2. ...вы делаете более безопасную функцию:

    function inline_json_encode($obj) {
        return str_replace('<!--', '<\!--', json_encode($obj));
    }
    
 2
Author: Ry-, 2014-01-08 18:19:06

Я не уверен, является ли это плохой практикой или нет, но моя команда и я использовали смешанное решение 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. Похоже, это действительно хорошо работает для нас. Посмотрим, выдержит ли он интенсивное использование.

 -2
Author: ioTus, 2010-08-27 00:28:00

Если вы используете механизм шаблонов для создания своего HTML, то вы можете заполнить его тем, чем когда-либо захотите!

Проверьте XTemplates. Это хороший, с открытым исходным кодом, легкий движок шаблонов.

Ваш HTML/JS там будет выглядеть так:

<script>
    var myvar = {$MyVarValue};
</script>
 -2
Author: Adam, 2014-08-20 09:34:54