将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 '&amp;' * '"' (double quote) becomes '&quot;' when ENT_NOQUOTES is not set. * ''' (single quote) becomes '&#039;' only when ENT_QUOTES is set. * '<' (less than) becomes '&lt;' * '>' (greater than) becomes '&gt;' 

http://ca.php.net/htmlspecialchars

您可以将其插入到隐藏的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> 
  1. 别。 使用Ajax,将其放在HTML中的data-*属性中,或其他有意义的东西。 使用内联脚本会使页面变大,并且可能不安全,或者仍然允许用户破坏布局 ,除非…

  2. …你做一个更安全的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>