将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>