这个问题在这里已有答案:
编码PHP字符串以输出到JavaScript变量的最简单方法是什么?
我有一个PHP字符串,其中包括引号和换行符 . 我需要将此字符串的内容放入JavaScript变量中 .
通常,我只是在PHP文件中构建我的JavaScript,àla:
<script> var myvar = "<?php echo $myVarValue;?>"; </script>
但是,当 $myVarValue 包含引号或换行符时,这不起作用 .
$myVarValue
扩展别人的答案:
<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_encode
</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发布的link表明存在一些较小的编码差异 . PHP的 rawurlencode() 函数应该符合RFC 1738,而Javascript的 decodeURIComponent() 似乎没有这样的努力 .
rawurlencode()
decodeURIComponent()
偏执狂版本: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; }
EDIT: json_encode() 可能不合适的原因是,有时候,您需要阻止生成 " ,例如
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;我投了票,但我的代表不够高 .
您可以将其插入隐藏的DIV中,然后将DIV的innerHTML分配给JavaScript变量 . 你不必担心逃避任何事情 . 请确保不要将破碎的HTML放在那里 .
你可以试试
<script type="text/javascript"> myvar = unescape('<?=rawurlencode($myvar)?>'); </script>
尽管 addslashes() 不要运行它;如果您在HTML页面的上下文中,HTML解析器仍然可以看到 </script> 标记,甚至是中间字符串,并假设它是JavaScript的结尾:
addslashes()
<?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>
不要 . 使用Ajax,将其放入HTML中的 data-* 属性或其他有意义的属性 . 使用内联脚本会使您的页面更大,并且could be insecure or still allow users to ruin layout,除非......
data-*
...你做了一个更安全的功能:
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 '>'
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” . 这对我们来说似乎非常有效 . 我们将看看它是否适用于大量使用 .
如果您使用模板引擎来构建HTML,那么您可以随意填写它!
看看XTemplates . 这是一个不错的开源轻量级模板引擎 .
您的HTML / JS看起来像这样:
<script> var myvar = {$MyVarValue}; </script>
14 回答
扩展别人的答案:
使用json_encode()要求:
PHP 5.2.0或更高版本
$myVarValue
编码为UTF-8(当然还有US-ASCII)由于UTF-8支持完整的Unicode,因此动态转换应该是安全的 .
请注意,因为
json_encode
转义正斜杠,所以即使包含</script>
的字符串也会安全转义,以便使用脚本块进行打印 .用JSON编码
我遇到了类似的问题,并了解以下是最佳解决方案:
然而,micahwittman发布的link表明存在一些较小的编码差异 . PHP的
rawurlencode()
函数应该符合RFC 1738,而Javascript的decodeURIComponent()
似乎没有这样的努力 .偏执狂版本:Escaping every single character .
EDIT:
json_encode()
可能不合适的原因是,有时候,您需要阻止生成"
,例如要么
Micah的解决方案适合我,因为我必须定制的网站不是UTF-8,所以我不能使用json;我投了票,但我的代表不够高 .
您可以将其插入隐藏的DIV中,然后将DIV的innerHTML分配给JavaScript变量 . 你不必担心逃避任何事情 . 请确保不要将破碎的HTML放在那里 .
你可以试试
尽管
addslashes()
不要运行它;如果您在HTML页面的上下文中,HTML解析器仍然可以看到</script>
标记,甚至是中间字符串,并假设它是JavaScript的结尾:不要 . 使用Ajax,将其放入HTML中的
data-*
属性或其他有意义的属性 . 使用内联脚本会使您的页面更大,并且could be insecure or still allow users to ruin layout,除非.........你做了一个更安全的功能:
用htmlspecialchars
描述
某些字符在HTML中具有特殊意义,如果要保留其含义,则应由HTML实体表示 . 此函数返回一个字符串,其中包含一些转换;所做的翻译是对日常网络编程最有用的翻译 . 如果您需要翻译所有HTML字符实体,请改用htmlentities() .
此功能可用于防止用户提供的文本包含HTML标记,例如在留言板或留言簿应用程序中 .
执行的翻译是:
http://ca.php.net/htmlspecialchars
我不确定这是不好的做法还是不行,但我的团队和我一直在使用混合的HTML,JS和php解决方案 . 我们从我们想要拉入JS变量的PHP字符串开始,让我们调用它:
接下来,我们使用页内隐藏的表单元素,并将其值设置为字符串:
然后通过document.getElementById定义JS var很简单:
现在,您可以在任何想要获取PHP字符串值的地方使用JS变量“moonUnitAlpha” . 这对我们来说似乎非常有效 . 我们将看看它是否适用于大量使用 .
如果您使用模板引擎来构建HTML,那么您可以随意填写它!
看看XTemplates . 这是一个不错的开源轻量级模板引擎 .
您的HTML / JS看起来像这样: