1

我遇到了一个涉及转义字符的问题,我认为这根本不简单。如果这是在 javascript 中完成的,没什么可说的,但上下文是使用 echo 命令(在 PHP 中)来编写这样的 javascript 代码:

echo "<script>document.getElementById('spanID').innerHTML=\"$x\"</script>";

$x 是 PHP 环境中的变量,可以包含单引号和双引号。我在这里做的是: 1. 保持 $x 不变,如果 $x 包含任何双引号,上面的代码将不起作用,回显的文本可能如下所示:

<script>document.getElementById('spanID').innerHTML="leftside"rightside"</script>;

我以为 $x = leftside"rightside,你可以看到它肯定行不通。

  1. 转义 $x 中的双引号(将所有 " 更改为

    "
    ),那么回显的文本可能如下所示:

    document.getElementById('spanID').innerHTML="leftside

    "
    右边”;

"
当它分配给 Span 的 innerHTML 属性时不会转换为“(例如),所以不是我想要的,我的 SPAN 的 innerHTML 应该是左侧”右侧,它将是左侧
"
右边。

如果我在原始回声中将“更改为”,如下所示:

echo "<script>document.getElementById('spanID').innerHTML='$x'</script>";

相同,因为这里的 $x 可以同时包含单引号和双引号。

在这种情况下,我没有找到任何其他方法来逃避引号。你能帮帮我吗?

谢谢!

4

1 回答 1

2

您需要在引号之间放置一个字符串,该字符串是包含有效(且安全)HTML 的有效 JavaScript 字符串。

您最好的选择是不使用innerHTML,而是使用document.createTextNode,这意味着您只需要对内容进行斜线转义。

否则,您需要 HTML 转义,然后斜杠转义内容。为了正确起见,您的斜杠转义函数应至少转义双引号、反斜杠和所有 JavaScript 换行符(U+A、U+D、U+2028、U+2029)。我相信 PHPaddslashes默认不处理 U+2028 或 U+2029 但是如何从 PHP 中转义字符串以获取 javascript?有一些选择。

把它们放在一起:

$x_escaped = json_encode($x, JSON_HEX_TAG);

echo "<script>document.getElementById('spanID').appendChild(document.createTextNode($x_escaped))</script>"

应该这样做。JSON_HEX_TAG 确保$x_escaped不会包含</script>或任何其他过早结束脚本标记的内容。 </script>反而会变成\u003c/script\u003e.

于 2012-12-05T16:12:04.943 回答