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

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

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

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

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

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

Ответ 1

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

<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.

Ответ 2

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

Ответ 3

function escapeJavaScriptText($string)
{
    return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\")));
}

Ответ 4

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

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

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

Ответ 5

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

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(???)" />

Ответ 6

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

или

<script>
var myVar = <?= json_encode($myVarValue) ?>;
</script>

Ответ 7

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

function escapeJavaScriptText($string) 
{ 
    return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\"))); 
} 

Ответ 8

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

Ответ 9

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

Ответ 10

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

<script type="text/javascript">
    myvar = unescape('<?=rawurlencode($myvar)?>');
</script>

Ответ 11

Не запускайте его, хотя 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>

Ответ 12

Ответ 13

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

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

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

<script>
    var myvar = {$MyVarValue};
</script>

Ответ 14

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