393

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

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

通常,我只会在 PHP 文件中构建我的 JavaScript,比如:

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

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

4

14 回答 14

545

扩展别人的答案:

<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>将被安全转义以使用脚本块进行打印。

于 2008-10-03T21:49:08.637 回答
28

用 JSON 编码

于 2008-10-03T18:33:50.967 回答
25
function escapeJavaScriptText($string)
{
    return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\")));
}
于 2008-10-03T18:38:29.303 回答
22

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

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

但是,micahwittman 发布的链接表明存在一些细微的编码差异。PHP 的rawurlencode()功能应该符合RFC 1738,而 Javascript 的decodeURIComponent().

于 2009-01-14T13:33:39.663 回答
13

偏执的版本:逃避每一个字符

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(???)" />
于 2011-04-23T09:32:45.943 回答
7
<script>
var myVar = <?php echo json_encode($myVarValue); ?>;
</script>

或者

<script>
var myVar = <?= json_encode($myVarValue) ?>;
</script>
于 2012-11-29T14:16:14.730 回答
5

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

function escapeJavaScriptText($string) 
{ 
    return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\"))); 
} 
于 2010-03-11T16:50:29.197 回答
4

不过不要运行它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>
于 2012-10-19T09:50:12.717 回答
3

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

于 2008-10-03T18:39:14.887 回答
3

你可以试试

<script type="text/javascript">
    myvar = unescape('<?=rawurlencode($myvar)?>');
</script>
于 2008-10-03T18:50:19.730 回答
3
  1. 不。使用 Ajax,将它放在data-*HTML 中的属性中,或者其他有意义的东西中。使用内联脚本会使您的页面更大,并且可能不安全或仍然允许用户破坏布局,除非……</p>

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

    function inline_json_encode($obj) {
        return str_replace('<!--', '<\!--', json_encode($obj));
    }
    
于 2014-01-08T18:19:06.007 回答
1

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

于 2008-10-03T18:37:46.230 回答
-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”。这对我们来说似乎非常有效。我们将看看它是否能够承受大量使用。

于 2010-08-27T00:28:00.340 回答
-2

如果你使用模板引擎来构建你的 HTML,那么你可以用你想要的任何东西来填充它!

查看XTemplates。这是一个不错的、开源的、轻量级的模板引擎。

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

<script>
    var myvar = {$MyVarValue};
</script>
于 2008-10-03T18:35:45.690 回答