将PHP字符串编码输出到JavaScript变量的最简单方法是什么?
我有一个PHP字符串,其中包括引号和换行。我需要将这个字符串的内容放入一个JavaScript变量中。
通常,我只会在一个PHP文件中构造我的JavaScript, à la:
<script>
var myvar = "<?php echo $myVarValue;?>";
</script>
但是,当$myVarValue包含引号或换行符时,这就不起作用了。
将PHP字符串编码输出到JavaScript变量的最简单方法是什么?
我有一个PHP字符串,其中包括引号和换行。我需要将这个字符串的内容放入一个JavaScript变量中。
通常,我只会在一个PHP文件中构造我的JavaScript, à la:
<script>
var myvar = "<?php echo $myVarValue;?>";
</script>
但是,当$myVarValue包含引号或换行符时,这就不起作用了。
当前回答
Micah的解决方案如下工作为我的网站,我必须自定义不是在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>
htmlspecialchars
描述
string htmlspecialchars ( string $string [, int $quote_style [, string $charset [, bool $double_encode ]]] )
某些字符在HTML中有特殊的意义,如果要保留它们的含义,就应该用HTML实体来表示。这个函数返回一个包含这些转换的字符串;所做的翻译是那些对日常web编程最有用的。如果需要翻译所有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 '>'
http://ca.php.net/htmlspecialchars
如果你使用模板引擎来构建你的HTML,那么你可以用任何你想要的东西来填充它!
查看XTemplates。 它是一个很好的、开源的、轻量级的模板引擎。
你的HTML/JS看起来是这样的:
<script>
var myvar = {$MyVarValue};
</script>
你可以试试
<script type="text/javascript">
myvar = unescape('<?=rawurlencode($myvar)?>');
</script>
偏执版本:逃避每一个角色。
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(???)" />