Передайте строку PHP в переменную JavaScript (и выйдите из новой строки)

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

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

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

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

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

339
03 окт. '08 в 21:27
источник поделиться
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>, будет безопасно удалена для печати с блоком script.

469
04 окт. '08 в 0:49
источник

закодировать его с помощью JSON

25
03 окт. '08 в 21:33
источник
function escapeJavaScriptText($string)
{
    return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\")));
}
19
03 окт. '08 в 21:38
источник

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

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

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

17
14 янв. '09 в 16:33
источник

Параноидальная версия: Экранирование каждого символа.

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;
}

EDIT: Причина, по которой json_encode() может оказаться неприемлемой, заключается в том, что иногда вам необходимо предотвратить создание ", например.

<div onclick="alert(???)" />
9
23 апр. '11 в 12:32
источник
<script>
var myVar = <?php echo json_encode($myVarValue); ?>;
</script>

или

<script>
var myVar = <?= json_encode($myVarValue) ?>;
</script>
5
29 нояб. '12 в 17:16
источник

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

function escapeJavaScriptText($string) 
{ 
    return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\"))); 
} 
3
11 марта '10 в 19:50
источник
2
08 янв. '14 в 21:19
источник

Вы можете попробовать

<script type="text/javascript">
    myvar = unescape('<?=rawurlencode($myvar)?>');
</script>
2
03 окт. '08 в 21:50
источник

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

2
03 окт. '08 в 21:39
источник

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

2
03 окт. '08 в 21: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>
2
19 окт. '12 в 12:50
источник

Я не уверен, что это плохая практика или нет, но моя команда и я используем смешанное решение 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
27 авг. '10 в 3:28
источник

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

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

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

<script>
    var myvar = {$MyVarValue};
</script>
-2
03 окт. '08 в 21:35
источник

Посмотрите другие вопросы по меткам или Задайте вопрос