我有一个包含引号和换行符的PHP字符串。我需要将此字符串的内容放入JavaScript变量中。
通常,我会在PHP文件中构建我的JavaScript,如下所示:
<script>
var myvar = "<?php echo $myVarValue;?>";
</script>
然而,当$myVarValue
包含引号或换行符时,这种方法就不起作用了。
<script>
var myvar = "<?php echo $myVarValue;?>";
</script>
然而,当$myVarValue
包含引号或换行符时,这种方法就不起作用了。
在别人的答案基础上进行扩展:
<script>
var myvar = <?= json_encode($myVarValue, JSON_UNESCAPED_UNICODE); ?>;
</script>
使用 json_encode() 需要:
$myVarValue
编码为 UTF-8(或 US-ASCII,当然也可以)由于 UTF-8 支持完整的 Unicode,因此在转换时应该是安全的。
请注意,如果您将其用于像 onclick 这样的 html 属性中,则需要将 json_encode 的结果传递给 htmlspecialchars(),如下所示:
htmlspecialchars(json_encode($string), ENT_QUOTES);
foo()&amp;&bar;
中的&bar;
被解释为HTML实体。onclick
属性等中使用此代码,则需要将json_encode
的结果传递给htmlspecialchars
,如下所示:htmlspecialchars(json_encode($string),ENT_QUOTES,'utf-8')
,否则您可能会遇到问题,例如,在foo()&&bar;
中的&bar;
被解释为HTML实体。 - user2428118"...</script>..."
时,在PHP的json_encode之后,它如何变成JS非字符串</script>
,而不仅仅是JS字符串"...</script>..."
?它总是为字符串添加引号。因此,var x = "...</script>...";
只是一个JS字符串。不会中断。回答:PHP字符串包含"...</script>..."
时,在PHP的json_encode之后,它将保持为JS字符串,即"...</script>..."
,并添加引号。因此,var x = "...</script>...";
是一个JS字符串,不会中断。 - FlameStorm使用JSON进行编码
</script>
(不区分大小写)的Javascript字符串得到适当处理。 - Flimmfunction escapeJavaScriptText($string)
{
return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\")));
}
decodeURIComponent
符合 RFC 3986 标准,我相信。 - Ry-谨慎的做法: 转义每个字符.
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(???)" />
<div onclick="alert(<?php echo htmlspecialchars(json_encode($var));?>" />
- Flimm<script>
var myVar = <?php echo json_encode($myVarValue); ?>;
</script>
或者
<script>
var myVar = <?= json_encode($myVarValue) ?>;
</script>
</script>
。 - FlimmMicah的解决方案对我非常有用,因为我需要定制的网站不是UTF-8编码,所以我不能使用json。我想给他投票,但我的声望还不够高。
function escapeJavaScriptText($string)
{
return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\")));
}
Don’t. Use Ajax, put it in data-*
attributes in your HTML, or something else meaningful. Using inline scripts makes your pages bigger, and could be insecure or still allow users to ruin layout, unless…
… you make a safer function:
function inline_json_encode($obj) {
return str_replace('<!--', '<\!--', json_encode($obj));
}
<!--
,在有效的 Javascript 字符串文字中唯一需要注意的是 </script>
,而 json_encode 从不输出它,因为它会转义正斜杠。 - Flimm<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编码器)。尽管第二个字符串包含一个未转义的正斜杠,而且这个例子完全是虚构的,但是恶意用户仍然可以造成这样的语法错误。 - Ry-不要在代码中使用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 '<'
,而当它是内联的时候,它可以正常工作。你有什么想法? - Ryan Dorn
json_encode
之前,您可以使用utf8_encode()
。这就是我正在做的:echo json_encode(utf8_encode($msg));
- carlosvini