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

StackOverflow https://stackoverflow.com/questions/168214

Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

Расширяя ответ кого-то другого:

<script>
  var myvar = <?php echo json_encode($myVarValue); ?>;
</script>

Используя json_encode() 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'\\"))); 
} 

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

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

    function inline_json_encode($obj) {
        return str_replace('<!--', '<\!--', json_encode($obj));
    }
    

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

Я не уверен, плохая это практика или нет, но мы с моей командой используем смешанное решение на 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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top