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

Dav*_*ing 375 javascript php newline escaping

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

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

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

<script>
  var myvar = "<?php echo $myVarValue;?>";
</script>
Run Code Online (Sandbox Code Playgroud)

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

bob*_*olt 513

扩展别人的答案:

<script>
  var myvar = <?php echo json_encode($myVarValue); ?>;
</script>
Run Code Online (Sandbox Code Playgroud)

使用json_encode()需要:

  • PHP 5.2.0或更高版本
  • $myVarValue 编码为UTF-8(当然还有US-ASCII)

由于UTF-8支持完整的Unicode,因此动态转换应该是安全的.

请注意,因为json_encode转义正斜杠,即使包含的字符串</script>也会安全地转义,以便使用脚本块进行打印.

  • 如果你使用UTF-8那是迄今为止最好的解决方案. (10认同)
  • 重要的是json_encode的实现会转义正斜杠.如果没有,如果$ myVarValue为"</ script>",则无效.但json_encode确实逃脱了正斜线,所以我们很好. (4认同)
  • @hakre:但是 PHP 字符串如何包含 `"...&lt;/script&gt;..."` 可以成为 JS 非字符串 `&lt;/script&gt;` 而不仅仅是 JS 字符串 `"...&lt;/script&gt;.. ."` 在 PHP 的 json_encode 之后?它总是为字符串添加引号。所以,`var x = "...&lt;/script&gt;...";` 只是一个 JS 字符串。没有休息。 (3认同)
  • 请注意,如果在`onclick`属性等中使用它,则需要将`json_encode`的结果传递给`htmlspecialchars`,如下所示:`htmlspecialchars(json_encode($ string),ENT_QUOTES,'utf-8 ')`或者你可能会遇到问题,例如``&bar;`在`foo()&& bar;`被解释为HTML实体. (2认同)

Jav*_*ier 27

用JSON编码

  • @nir:一方面,我不知道有什么理由使用任何其他编码,另一方面,完整的JSON编码器也管理任何所需的字符集转换 (4认同)
  • 使用 JSON 对单个标量值进行编码不会将其强制转换为对象 - 您只会得到一个 utf-8 字符串。例如,假设您的 php 代码如下所示: $x="&lt;script&gt;alert('xss!');&lt;/script&gt;"; 你的 HTML 看起来像这样: &lt;script&gt;var x=&lt;?= json_encode($x);?&gt;&lt;/script&gt; 浏览的结果将是: &lt;script&gt;var x="&lt;script&gt;alert('xss !');&lt;\/script&gt;"&lt;/script&gt; 请注意双引号和转义斜杠。 (2认同)

mic*_*man 22

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


pr1*_*001 21

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

<script>
    var myvar = decodeURIComponent("<?php echo rawurlencode($myVarValue); ?>");
</script>
Run Code Online (Sandbox Code Playgroud)

但是,micahwittman发布的链接表明存在一些较小的编码差异.PHP的rawurlencode()功能应该符合RFC 1738,而Javascript似乎没有这样的努力decodeURIComponent().


gir*_*aff 11

偏执狂版本:逃避每一个角色.

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;
}
Run Code Online (Sandbox Code Playgroud)

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

<div onclick="alert(???)" />
Run Code Online (Sandbox Code Playgroud)


Kld*_*Kld 6

<script>
var myVar = <?php echo json_encode($myVarValue); ?>;
</script>
Run Code Online (Sandbox Code Playgroud)

要么

<script>
var myVar = <?= json_encode($myVarValue) ?>;
</script>
Run Code Online (Sandbox Code Playgroud)


小智 5

下面的Micah解决方案为我工作,因为我必须自定义的站点不在UTF-8中,因此我无法使用json;我会投票赞成,但我的代表不够高。

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