将PHPstring传递给JavaScriptvariables(并转义换行符)
对输出到JavaScriptvariables的PHPstring进行编码最简单的方法是什么?
我有一个包含引号和换行符的PHPstring。 我需要把这个string的内容放入一个JavaScriptvariables中。
通常,我只是将我的JavaScript构build在一个PHP文件中,la:
<script> var myvar = "<?php echo $myVarValue;?>"; </script>
但是,当$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>
的string也将被安全地转义以用脚本块打印。
用JSON编码
function escapeJavaScriptText($string) { return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\"))); }
我有类似的问题,并明白以下是最好的解决scheme:
<script> var myvar = decodeURIComponent("<?php echo rawurlencode($myVarValue); ?>"); </script>
然而,micahwittman发布的链接表明,有一些小的编码差异。 PHP的rawurlencode()
函数应该符合RFC 1738 ,而Javascript的decodeURIComponent()
似乎没有这样的努力。
<script> var myVar = <?php echo json_encode($myVarValue); ?>; </script>
要么
<script> var myVar = <?= json_encode($myVarValue) ?>; </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()
可能不适当的原因是,有时,你需要防止"
要生成,例如
<div onclick="alert(???)" />
下面的Micah的解决scheme为我工作,因为我必须定制的网站不是UTF-8,所以我不能使用JSON; 我会投它,但我的代表不够高。
function escapeJavaScriptText($string) { return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\"))); }
用htmlspecialchars
描述
string htmlspecialchars ( string $string [, int $quote_style [, string $charset [, bool $double_encode ]]] )
某些字符在HTML中有特殊的意义,如果要保留它们的含义,应该用HTML实体来表示。 这个函数返回一个包含这些转换的string; 所做的翻译是对日常networking编程最有用的。 如果您需要翻译所有HTML字符实体,请改用htmlentities()。
此function可用于防止用户提供的文本包含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 '>'
您可以将其插入到隐藏的DIV中,然后将DIV的innerHTML分配给您的JavaScriptvariables。 你不必担心逃脱任何事情。 只要确保不要把破碎的HTML放在那里。
你可以试试
<script type="text/javascript"> myvar = unescape('<?=rawurlencode($myvar)?>'); </script>
不要运行它虽然addslashes()
; 如果您处于HTML页面的上下文中,那么HTMLparsing器仍然可以看到</script>
标记,甚至是中间string,并假定它是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>
-
别。 使用Ajax,将其放在HTML中的
data-*
属性中,或其他有意义的东西。 使用内联脚本会使页面变大,并且可能不安全,或者仍然允许用户破坏布局 ,除非… -
…你做一个更安全的function:
function inline_json_encode($obj) { return str_replace('<!--', '<\!--', json_encode($obj)); }
我不知道这是否是不好的做法,但我的团队和我一直在使用混合的HTML,JS和PHP解决scheme。 我们从我们想要拉入JSvariables的PHPstring开始,让我们调用它:
$someString
接下来我们使用页面内隐藏的表单元素,并将它们的值设置为string:
<form id="pagePhpVars" method="post"> <input type="hidden" name="phpString1" id="phpString1" value="'.$someString.'" /> </form>
然后通过document.getElementById定义一个JSvariables的简单问题:
<script type="text/javascript" charset="UTF-8"> var moonUnitAlpha = document.getElementById('phpString1').value; </script>
现在,您可以在任何想要抓取该PHPstring值的地方使用JSvariables“moonUnitAlpha”。 这似乎对我们真的很好。 我们会看看它是否适合大量使用。
如果你使用模板引擎来构build你的HTML,那么你可以用你想要的来填充它!
看看XTemplates 。 这是一个不错的开源轻量级模板引擎。
你的HTML / JS看起来像这样:
<script> var myvar = {$MyVarValue}; </script>