对 PHP 字符串进行编码以输出到 JavaScript 变量的最简单方法是什么?
我有一个包含引号和换行符的 PHP 字符串。我需要将此字符串的内容放入 JavaScript 变量中。
通常,我只会在 PHP 文件中构建我的 JavaScript,比如:
<script>
var myvar = "<?php echo $myVarValue;?>";
</script>
$myVarValue
但是,当包含引号或换行符时,这不起作用。
对 PHP 字符串进行编码以输出到 JavaScript 变量的最简单方法是什么?
我有一个包含引号和换行符的 PHP 字符串。我需要将此字符串的内容放入 JavaScript 变量中。
通常,我只会在 PHP 文件中构建我的 JavaScript,比如:
<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>
将被安全转义以使用脚本块进行打印。
用 JSON 编码
function escapeJavaScriptText($string)
{
return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\")));
}
偏执的版本:逃避每一个字符。
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(???)" />
<script>
var myVar = <?php echo json_encode($myVarValue); ?>;
</script>
或者
<script>
var myVar = <?= json_encode($myVarValue) ?>;
</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>
您可以将其插入隐藏的 DIV,然后将 DIV 的 innerHTML 分配给您的 JavaScript 变量。你不必担心逃避任何事情。请确保不要将损坏的 HTML 放在那里。
你可以试试
<script type="text/javascript">
myvar = unescape('<?=rawurlencode($myvar)?>');
</script>
不。使用 Ajax,将它放在data-*
HTML 中的属性中,或者其他有意义的东西中。使用内联脚本会使您的页面更大,并且可能不安全或仍然允许用户破坏布局,除非……</p>
......你做了一个更安全的功能:
function inline_json_encode($obj) {
return str_replace('<!--', '<\!--', json_encode($obj));
}
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 '>'
我不确定这是否是不好的做法,但我和我的团队一直在使用混合的 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”。这对我们来说似乎非常有效。我们将看看它是否能够承受大量使用。
如果你使用模板引擎来构建你的 HTML,那么你可以用你想要的任何东西来填充它!
查看XTemplates。这是一个不错的、开源的、轻量级的模板引擎。
你的 HTML/JS 看起来像这样:
<script>
var myvar = {$MyVarValue};
</script>