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

Закодировать его с помощью 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>

Тем не менее, ссылка, которую разместил 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>
  1. Не. Используйте Ajax, вставьте его в data-* атрибуты в вашем HTML или что-то еще значимое. Использование встроенных сценариев делает ваши страницы больше, и может быть небезопасным или все же позволяет пользователям разрушать макет, если…

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

    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 '&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

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

Другие вопросы по тегам