这个问题在这里已经有了答案:如何将变量和数据从 PHP 传递到 JavaScript? (19 个回答) 8 年前关闭。社区在 8 个月前审查了是否重新打开此问题并将其关闭:原始关闭原因未解决
对 PHP 字符串进行编码以输出到 JavaScript 变量的最简单方法是什么?
我有一个包含引号和换行符的 PHP 字符串。我需要将此字符串的内容放入 JavaScript 变量中。
通常,我只会在 PHP 文件中构建我的 JavaScript,比如:
<script>
var myvar = "<?php echo $myVarValue;?>";
</script>
但是,当 $myVarValue
包含引号或换行符时,这不起作用。
json_encode
之前使用 utf8_encode()
。这就是我正在做的事情:echo json_encode(utf8_encode($msg));
扩展别人的答案:
<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>
的字符串也将被安全转义,以便使用脚本块进行打印。
用 JSON 编码
</script>
(不区分大小写)的 Javascript 字符串。
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 发布的 link 表明存在一些细微的编码差异。 PHP 的 rawurlencode()
函数应该符合 RFC 1738,而 Javascript 的 decodeURIComponent()
似乎没有这样的努力。
decodeURIComponent
符合 RFC 3986,我相信。
偏执的版本:Escaping every single character。
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));?>" />
<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'\\")));
}
不要通过 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 '<'
仅当我引用外部 .js 文件时,当它是 inilne 时,它工作正常。想法?
您可以将其插入隐藏的 DIV,然后将 DIV 的 innerHTML 分配给您的 JavaScript 变量。你不必担心逃避任何事情。请确保不要将损坏的 HTML 放在那里。
你可以试试
<script type="text/javascript">
myvar = unescape('<?=rawurlencode($myvar)?>');
</script>
unescape
现在已弃用。请改用 decodeURIComponent
。
不。使用 Ajax,将它放在 HTML 中的 data-* 属性中,或者其他有意义的东西中。使用内联脚本会使你的页面变得更大,并且可能不安全或仍然允许用户破坏布局,除非……你创建一个更安全的函数: function inline_json_encode($obj) { return str_replace('
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 '>'
http://ca.php.net/htmlspecialchars
我不确定这是否是不好的做法,但我和我的团队一直在使用混合的 html、JS 和 php 解决方案。我们从想要拉入 JS 变量的 PHP 字符串开始,我们将其命名为:
$someString
接下来我们使用页面内隐藏的表单元素,并将它们的值设置为字符串:
<form id="pagePhpVars" method="post">
<input type="hidden" name="phpString1" id="phpString1" value="'.$someString.'" />
</form>
然后通过 document.getElementById 定义一个 JS var 就很简单了:
<script type="text/javascript" charset="UTF-8">
var moonUnitAlpha = document.getElementById('phpString1').value;
</script>
现在,您可以在任何想要获取 PHP 字符串值的地方使用 JS 变量“moonUnitAlpha”。这对我们来说似乎非常有效。我们将看看它是否能够承受大量使用。
value="<?php echo htmlspecialchars(json_encode($someString));?>"
。
如果你使用模板引擎来构建你的 HTML,那么你可以用你想要的任何东西来填充它!
查看XTemplates。这是一个不错的、开源的、轻量级的模板引擎。
你的 HTML/JS 看起来像这样:
<script>
var myvar = {$MyVarValue};
</script>
不定期副业成功案例分享
onclick
属性等中使用它,您需要将json_encode
的结果传递给htmlspecialchars
,如下所示:htmlspecialchars(json_encode($string),ENT_QUOTES,'utf-8')
否则您可能会遇到问题,例如 {foo()&&bar;
中的 5} 被解释为 HTML 实体。"...</script>..."
可以在 PHP 的 json_encode 之后变成 JS 非字符串</script>
而不仅仅是 JS 字符串"...</script>..."
?它总是为字符串添加引号。所以,var x = "...</script>...";
只是一个 JS 字符串。没有休息。