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

IT技术 php javascript escaping newline
2021-01-17 20:52:37

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

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

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

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

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

6个回答

扩展别人的答案:

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

@hakre:但是在 PHP 的 json_encode 之后,PHP字符串包含"...</script>..."如何成为 JS 非字符串,</script>而不仅仅是 JS 字符串"...</script>..."它总是为字符串添加引号。所以,var x = "...</script>...";只是一个JS字符串。没有休息。
2021-03-09 20:52:37
json_encode 的实现转义正斜杠很重要。如果没有,如果 $myVarValue 是“</script>”,这将不起作用。但是 json_encode 确实可以转义正斜杠,所以我们很好。
2021-03-18 20:52:37
请注意,如果你使用这个在onclick属性等,需要传递的结果json_encodehtmlspecialchars,像下面这样:htmlspecialchars(json_encode($string),ENT_QUOTES,'utf-8')否则你可能会得到有问题的,例如,&bar;foo()&&bar;被解释为HTML实体。
2021-03-28 20:52:37
如果您不是 5.2,请尝试来自 booutell.com booutell.com/scripts/jsonwrapper.html 的 jsonwrapper
2021-03-31 20:52:37
如果您使用 UTF-8,那是目前最好的解决方案。
2021-04-05 20:52:37

用 JSON 编码

@nir:一方面,我不知道有任何理由使用任何其他编码,另一方面,完整的 JSON 编码器还管理任何需要的字符集转换
2021-03-14 20:52:37
可能是让它 100% 工作的最简单方法。有太多的案例无法涵盖。
2021-03-17 20:52:37
使用 JSON 编码单个标量值不会将其强制为对象 - 您只会得到一个 utf-8 字符串。例如,假设您的 php 代码如下所示: $x="<script>alert('xss!');</script>"; 你的 HTML 看起来像这样: <script>var x=<?= json_encode($x);?></script> 浏览的结果将是: <script>var x="<script>alert('xss !');<\/script>"</script> 注意双引号和转义斜杠。
2021-03-17 20:52:37
Json 仅适用于 UTF-8 字符集。因此,如果您的网站使用非 UTF-8 编码,这不是解决方案
2021-03-24 20:52:37
使用 JSON 对其进行编码是不够的,您还必须确保</script>正确处理任何包含(不区分大小写)的Javascript 字符串
2021-04-03 20:52:37
function escapeJavaScriptText($string)
{
    return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\")));
}
我需要这个,因为我将变量的内容用作连接的 javascript 表达式的一部分。
2021-03-15 20:52:37
这真的帮助了我。
2021-03-22 20:52:37

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

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

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

这是解析大字符串时的正确解决方案(例如:html 内容为字符串)
2021-03-14 20:52:37
decodeURIComponent 我相信符合 RFC 3986。
2021-03-29 20:52:37
@RaduGheorghies 为什么?
2021-04-07 20:52:37

偏执版本:转义每个字符

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(???)" />
逃避每一个角色对我有用。json_encode 不能很好地处理反斜杠。如果您需要将诸如正则表达式之类的东西作为参数从 mysql 传递给 javascript,那么这似乎是最好的方法。
2021-03-24 20:52:37
@kristoffer-ryhl 正确地指出 dechex 不适用于 '\t' (= '\x08'),因此我对其进行了编辑以使用 sprintf。但是,这似乎仍然不适用于 UTF-8 字符(这需要使用 '\u' 代替)......
2021-03-29 20:52:37
这不是 unicode 保存,请查看:docs.laminas.dev/laminas-escaper/escaping-javascript
2021-03-30 20:52:37
对于 HTML 属性,你可以这样做 <div onclick="alert(<?php echo htmlspecialchars(json_encode($var));?>" />
2021-04-06 20:52:37