ChatGPT解决这个技术问题 Extra ChatGPT

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

这个问题在这里已经有了答案:如何将变量和数据从 PHP 传递到 JavaScript? (19 个回答) 8 年前关闭。社区在 8 个月前审查了是否重新打开此问题并将其关闭:原始关闭原因未解决

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

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

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

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

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

只是想指出您可以在将字符串传递给 json_encode 之前使用 utf8_encode()。这就是我正在做的事情:echo json_encode(utf8_encode($msg));
不是 stackoverflow.com/questions/23740548/… 的副本。后者谈到 AJAX 等和网络问题,而这里是关于编码/转义/引号和换行符。让我们重新开始? (顺便说一句,这里接受的很短,效果很好并且有数百张选票)

F
Flimm

扩展别人的答案:

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


如果您使用 UTF-8,那是迄今为止最好的解决方案。
重要的是 json_encode 的实现转义正斜杠。如果没有,如果 $myVarValue 是“”,这将不起作用。但是 json_encode 确实会转义正斜杠,所以我们很好。
如果您不是 5.2,请尝试使用 botell.com 的 jsonwrapper boutell.com/scripts/jsonwrapper.html
请注意,如果您在 onclick 属性等中使用它,您需要将 json_encode 的结果传递给 htmlspecialchars,如下所示:htmlspecialchars(json_encode($string),ENT_QUOTES,'utf-8') 否则您可能会遇到问题,例如 { foo()&&bar; 中的 5} 被解释为 HTML 实体。
@hakre:但是 PHP 字符串如何包含 "...</script>..." 可以在 PHP 的 json_encode 之后变成 JS 非字符串 </script> 而不仅仅是 JS 字符串 "...</script>..."?它总是为字符串添加引号。所以,var x = "...</script>..."; 只是一个 JS 字符串。没有休息。
J
Javier

用 JSON 编码


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

我需要这个,因为我将变量的内容用作连接的 javascript 表达式的一部分。
这真的帮助了我。
p
pr1001

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

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

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


decodeURIComponent 符合 RFC 3986,我相信。
这是解析大字符串时的正确解决方案(例如:将 html 内容作为字符串)
@RaduGheorghies 为什么?
g
giraff

偏执的版本: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(???)" />

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

或者

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

不得将编码值括在引号中。
请注意, json_encode 会转义正斜杠,这意味着它永远不会意外打印 </script>
S
SLaks

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

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

我也是!这两行代码是 php 发生的最好的事情(至少恕我直言)。非常感谢!!
R
Ry-

不要通过 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>

也许我犯了一个愚蠢的错误,但是当我尝试执行此代码时,我会收到以下控制台错误 SyntaxError: expected expression, got '<' 仅当我引用外部 .js 文件时,当它是 inilne 时,它工作正常。想法?
@RADMKT 只是一个猜测,但如果它是一个 .js 文件,它可能没有使用 PHP。可能值得在 Web 浏览器中加载外部 JS 文件以查看代码输出。
D
Diodeus - James MacFarlane

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


“不要把损坏的 HTML 放在那里”,这意味着转义 'HTML 实体'(至少是 '<' 和 '&')
不,只是不要过早关闭您的容器 DIV。
J
Jacob

你可以试试

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

不完全奏效。试试这个字符串::: 我想知道 "hey jude" 因为 1 + 1 < 5 ::: 我们仍然得到 <所以不是 100% 的双向音译
unescape 现在已弃用。请改用 decodeURIComponent
R
Ry-

不。使用 Ajax,将它放在 HTML 中的 data-* 属性中,或者其他有意义的东西中。使用内联脚本会使你的页面变得更大,并且可能不安全或仍然允许用户破坏布局,除非……你创建一个更安全的函数: function inline_json_encode($obj) { return str_replace('

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


只有当 JS 变量的内容实际上应该是 HTML 时,这才是正确的解决方案,其中像 & 这样的字符串标记有意义。否则,最好不要将它们转换为实体。
i
ioTus

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


我在以前的项目中一直在这样做。下一次,我会尝试使用 jQuery 数据。
记得对你的 $someString 进行 htmlencode... 虽然这对于输入 @value 来说很好,但你必须格外小心 href/src/onclick 类型属性(尝试列入白名单),因为它们可以直接使用 javascript : 协议,不受 html 编码值的保护。
为了安全起见,您确实应该执行value="<?php echo htmlspecialchars(json_encode($someString));?>"
C
Chandru

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

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

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

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