将PHP字符串编码输出到JavaScript变量的最简单方法是什么?
我有一个PHP字符串,其中包括引号和换行。我需要将这个字符串的内容放入一个JavaScript变量中。
通常,我只会在一个PHP文件中构造我的JavaScript, à la:
<script> var myvar = "<?php echo $myVarValue;?>"; </script>
然而,当$myVarValue包含引号或换行符时,这将不起作用。
$myVarValue
用JSON编码
如果你使用模板引擎来构建你的HTML,那么你可以用任何你想要的东西来填充它!
检查XTemplates。 这是一个很好的、开源的、轻量级的模板引擎
你的HTML/JS看起来是这样的:
<script> var myvar = {$MyVarValue}; </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
function escapeJavaScriptText($string) { return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\"))); }
您可以将它插入一个隐藏的DIV中,然后将DIV的innerHTML分配给JavaScript变量。你不用担心会逃掉任何东西。只是要确保不要把坏的HTML放在那里。
你可以试试
<script type="text/javascript"> myvar = unescape('<?=rawurlencode($myvar)?>'); </script>
扩展别人的回答:
<script> var myvar = <?php echo json_encode($myVarValue); ?>; </script>
使用json_encode ()需要:
由于UTF-8支持完整的Unicode,因此动态转换应该是安全的。
注意,因为json_encode转义正斜杠,即使包含</script>的字符串也会被安全地转义,以便用脚本块打印。
json_encode
</script>
我曾经遇到过类似的问题,我认为以下是最好的解决方案:
<script> var myvar = decodeURIComponent("<?php echo rawurlencode($myVarValue); ?>"); </script>
然而,micahwittman发布的链接表明存在一些小的编码差异。PHP的rawurlencode()函数应该符合RFC 1738,而Javascript的decodeURIComponent()函数似乎没有这样的努力。
rawurlencode()
decodeURIComponent()
Micah的解决方案如下工作为我的网站,我必须自定义不是在UTF-8,所以我不能使用json;我也想投票,但我的声望不够高。
我不确定这是否是不好的做法,但我和我的团队一直在使用混合的html、JS和php解决方案。我们从想要拉入JS变量的PHP字符串开始,让我们称之为:
$someString
接下来我们使用页面内的隐藏表单元素,并将它们的值设置为字符串:
<form id="pagePhpVars" method="post"> <input type="hidden" name="phpString1" id="phpString1" value="'.$someString.'" /> </form>
然后通过document.getElementById定义一个JS变量就很简单了:
<script type="text/javascript" charset="UTF-8"> var moonUnitAlpha = document.getElementById('phpString1').value; </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()可能不合适的原因是,有时候,你需要防止生成"。
json_encode()
"
<div onclick="alert(???)" />
不要通过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>
<script> var myVar = <?php echo json_encode($myVarValue); ?>; </script>
或
<script> var myVar = <?= json_encode($myVarValue) ?>; </script>
不喜欢。使用Ajax,将其放在HTML中的data-*属性中,或其他有意义的东西中。使用内联脚本使您的页面更大,可能是不安全的或仍然允许用户破坏布局,除非…
data-*
…你使一个更安全的函数:
function inline_json_encode($obj) { return str_replace('<!--', '<\!--', json_encode($obj)); }