Что является самым простым способом кодирования строки PHP для вывода в переменную JavaScript?
У меня есть строка PHP, которая включает в себя цитаты и новые строки. Мне нужно, чтобы содержимое этой строки помещалось в переменную JavaScript.
Обычно я просто создаю свой JavaScript в файле PHP, à la:
<script>
var myvar = "<?php echo $myVarValue;?>";
</script>
Однако это не работает, если $myVarValue
содержит кавычки или символы новой строки.
Расширение ответа на кого-то другого:
<script>
var myvar = <?php echo json_encode($myVarValue); ?>;
</script>
Использование json_encode() требует:
$myVarValue
закодирован как UTF-8 (или US-ASCII, конечно)Так как UTF-8 поддерживает полный Unicode, безопасно конвертировать на лету.
Обратите внимание, что поскольку json_encode
вытесняет косую черту, даже строка, содержащая </script>
, будет безопасно удалена для печати с блоком 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, указывает на наличие незначительных различий в кодировке. Предполагается, что функция PHP rawurlencode()
должна соответствовать RFC 1738, хотя, похоже, не было таких усилий с Javascript decodeURIComponent()
.
decodeURIComponent
соответствует RFC 3986.
Параноидальная версия: Экранирование каждого символа.
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(???)" />
<script>
var myVar = <?php echo json_encode($myVarValue); ?>;
</script>
или
<script>
var myVar = <?= json_encode($myVarValue) ?>;
</script>
</script>
случайно.
Решение Micah ниже работало для меня, поскольку сайт, который я должен был настроить, не был в UTF-8, поэтому я не мог использовать json; Я проголосую, но мой представитель недостаточно высок.
function escapeJavaScriptText($string)
{
return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\")));
}
Dont. Используйте Ajax, поместите его в атрибуты data-*
в свой HTML или что-то еще значимое. Использование встроенных скриптов делает ваши страницы большими, а может быть небезопасным или по-прежнему разрешать пользователям разрушать макет, если...
... вы делаете более безопасную функцию:
function inline_json_encode($obj) {
return str_replace('<!--', '<\!--', json_encode($obj));
}
<!--
не нужно экранировать внутри блока скрипта, единственное, на что нужно обратить внимание в допустимом строковом литерале Javascript - это </script>
, и json_encode никогда не выводит его, потому что он ускользает от косой черты.
<script>console.log("<!--<script>")</script><script>console.log(")/;alert('execute arbitrary code here');<!---->")</script>
, где две строки, переданные в console.log
предоставляются пользователем (т. е. шаблон выглядит как <script>console.log({{ s1 }})</script><script>console.log({{ s2 }})</script>
, где $s1
и $s2
получены из плохого кодера JSON). Конечно, вторая строка содержит косую черту без экранирования, и пример полностью придуман, но злонамеренный пользователь все еще может вызвать синтаксическую ошибку, подобную этой.
Не запускайте его, хотя 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>
SyntaxError: expected expression, got '<'
ТОЛЬКО SyntaxError: expected expression, got '<'
когда я обращаюсь к внешнему файлу .js, когда он inilne, он работает отлично. Мысли?
htmlspecialchars
Описание
string htmlspecialchars ( string $string [, int $quote_style [, string $charset [, bool $double_encode ]]] )
Некоторые символы имеют особое значение в HTML и должны быть представлены объектами HTML, если они должны сохранять их значения. Эта функция возвращает строку с некоторыми из сделанных преобразований; сделанные переводы являются наиболее полезными для повседневного веб-программирования. Если вам требуется перевести все символы символов HTML, используйте вместо этого htmlentities().
Эта функция полезна для предотвращения того, чтобы текст, предоставленный пользователем, содержал разметку HTML, например, на доске объявлений или приложении гостевой книги.
Выполненные переводы:
* '&' (ampersand) becomes '&'
* '"' (double quote) becomes '"' when ENT_NOQUOTES is not set.
* ''' (single quote) becomes ''' only when ENT_QUOTES is set.
* '<' (less than) becomes '<'
* '>' (greater than) becomes '>'
Вы можете попробовать
<script type="text/javascript">
myvar = unescape('<?=rawurlencode($myvar)?>');
</script>
unescape
устарела. decodeURIComponent
этого используйте decodeURIComponent
.
Вы можете вставить его в скрытый DIV, а затем назначьте innerHTML DIV вашей переменной JavaScript. Вам не нужно беспокоиться о том, чтобы избежать чего-либо. Просто убедитесь, что там не сломанный HTML-код.
Если вы используете шаблонный движок для создания своего 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 var через document.getElementById:
<script type="text/javascript" charset="UTF-8">
var moonUnitAlpha = document.getElementById('phpString1').value;
</script>
Теперь вы можете использовать JS-переменную "moonUnitAlpha" в любом месте, где хотите захватить это строковое значение PHP. Кажется, это работает очень хорошо для нас. Мы посмотрим, будет ли это зависеть от тяжелого использования.
utf8_encode()
перед передачей строки вjson_encode
. Вот что я делаю:echo json_encode(utf8_encode($msg));