将PHP字符串传递给JavaScript变量(并转义换行符)

时间:2008-10-03 18:27:04

标签: php javascript escaping newline

对输出到JavaScript变量的PHP字符串进行编码的最简单方法是什么?

我有一个包含引号和换行符的PHP字符串。我需要将此字符串的内容放入JavaScript变量中。

通常,我只是在PHP文件中构建我的JavaScript,àla:

<script>
  var myvar = "<?php echo $myVarValue;?>";
</script>

但是,当$myVarValue包含引号或换行符时,这不起作用。

14 个答案:

答案 0 :(得分:497)

扩大别人的答案:

<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>的字符串也会安全转义,以便使用脚本块进行打印。

答案 1 :(得分:26)

用JSON编码它

答案 2 :(得分:21)

function escapeJavaScriptText($string)
{
    return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\")));
}

答案 3 :(得分:20)

我遇到了类似的问题,并了解以下是最佳解决方案:

<script>
    var myvar = decodeURIComponent("<?php echo rawurlencode($myVarValue); ?>");
</script>

然而,micahwittman发布的link表明存在一些较小的编码差异。 PHP的rawurlencode()函数应该符合RFC 1738,而Javascript的decodeURIComponent()似乎没有这样的努力。

答案 4 :(得分:10)

偏执狂版本: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;
}

编辑json_encode()可能不合适的原因是,有时您需要阻止生成",例如

<div onclick="alert(???)" />

答案 5 :(得分:6)

<script>
var myVar = <?php echo json_encode($myVarValue); ?>;
</script>

<script>
var myVar = <?= json_encode($myVarValue) ?>;
</script>

答案 6 :(得分:5)

Micah的解决方案对我有用,因为我必须定制的网站不是UTF-8,所以我不能使用json;我投了票,但我的代表不够高。

function escapeJavaScriptText($string) 
{ 
    return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\"))); 
} 

答案 7 :(得分:3)

您可以将其插入隐藏的DIV中,然后将DIV的innerHTML分配给您的JavaScript变量。你不必担心逃避任何事情。请确保不要将破坏的HTML放在那里。

答案 8 :(得分:3)

你可以尝试

<script type="text/javascript">
    myvar = unescape('<?=rawurlencode($myvar)?>');
</script>

答案 9 :(得分:3)

不要通过addslashes()运行它;如果您在HTML页面的上下文中,HTML解析器仍然可以看到</script>标记,甚至是中间字符串,并假设它是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>

答案 10 :(得分:3)

  1. 别。使用Ajax,将其放入HTML中的data-*属性或其他有意义的属性。使用内联脚本会使您的网页更大,could be insecure or still allow users to ruin layout,除非......

  2. ...你做了一个更安全的功能:

    function inline_json_encode($obj) {
        return str_replace('<!--', '<\!--', json_encode($obj));
    }
    

答案 11 :(得分:2)

用htmlspecialchars

描述

string htmlspecialchars ( string $string [, int $quote_style [, string $charset [, bool $double_encode ]]] )

某些字符在HTML中具有特殊意义,如果要保留其含义,则应由HTML实体表示。此函数返回一个字符串,其中包含一些转换;所做的翻译是对日常网络编程最有用的翻译。如果您需要翻译所有HTML字符实体,请改用htmlentities()。

此功能可用于防止用户提供的文本包含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

答案 12 :(得分:-1)

如果您使用模板引擎构建HTML,那么您可以随意填写它!

结帐XTemplates。 这是一个很好的,开源的,轻量级的模板引擎。

你的HTML / JS看起来像这样:

<script>
    var myvar = {$MyVarValue};
</script>

答案 13 :(得分:-1)

我不确定这是不好的做法还是不行,但我和我的团队一直在使用混合的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”。 这对我们来说似乎非常有效。我们将看看它是否能够持续使用。