【问题标题】:Escape </ in script tag contents在脚本标签内容中转义 </
【发布时间】:2013-01-24 16:59:44
【问题描述】:

在 HTML 中,标签和实体不会在 &lt;script&gt; 标签内解析,&lt;/ 会立即结束标签。因此,

<script><b>fun &amp; things</

会给你一个脚本标签,里面有确切的内容&lt;b&gt;fun &amp;amp; things

如果您要包含 JSON 并且希望在脚本中包含字符 &lt;/,那么您可以将其替换为 &lt;\/,因为这些字符出现的唯一位置是字符串,而 \/是一个转义序列,变成一个正斜杠。

但是,如果您不使用 JavaScript,那么这个技巧就不起作用。就我而言,我正在尝试将&lt;script type="math/tex"&gt; 插入源代码,以便MathJax 处理它。有没有办法在原始 HTML 源代码中转义 &lt;/? (我对&lt;/ 没有特别的需求,但我正在编写一个通用工具并希望可以使用任何文本。)

(可以在 JavaScript 中创建脚本标签并填充其 innerText,但我正在使用原始 HTML,所以我不能这样做。)

【问题讨论】:

  • 你不能用&amp;lt;吗?我不清楚你想在这里做什么。
  • 所以,基本上,您是在尝试编码&lt;script&gt;&lt;/script&gt; 标签之间的任何HTML,而不编码实际的脚本标签本身?
  • @Oded:不,由于脚本标签的工作方式,如果您使用&amp;lt;,您实际上会得到四个字符&amp;lt;
  • 你能澄清这个问题以及你想要达到的目标吗?真的很难理解你想在这里做什么以及为什么序列&lt;/很重要。
  • @Oded:抱歉,现在可能清楚一点了。

标签: html


【解决方案1】:

更多的 HTML 编码可能会有所帮助? &amp;lt;&lt;

很难完全知道你在用它做什么。如果您不确定脚本标签之间的内容可能是什么(看起来您可能正在尝试将其用作某种模板持有者?)那么您可以/应该使用 CDATA 部分:

<script><![CDATA[<b>fun &amp; things</b>]]></script>

应该这样做。更多描述也有助于给出更好的答案:)

【讨论】:

  • 请注意,CDATA 是 XHTML 功能,在 HTML 中没有任何作用。
【解决方案2】:

在 HTML 中,与 XHTML 相反,script 元素的内容除了出现结束标记外都被处理为纯文本,因此&lt;/ 结束处理,并且必须在符合标准的文档中开始结束标记&lt;/script&gt;。没有通用的机制来避免这种情况。任何绕过此功能的方法都不可避免地依赖于元素内部使用的“语言”。 “语言”一词在这里用引号引起来,因为内容可以是任何东西,只要您的代码可以解析和处理它。

所以:没有通用机制,但对于 JavaScript 或某些浏览器可识别的少数其他客户端脚本语言之外的内容,您可以制定自己的规则。

【讨论】:

  • 脚本标签内的 Unicode \u003c-like 编码不是通用解决方案吗?它是在 Rails 和 Flask 中为 JSON 实现的(我的问题底部的实现链接:stackoverflow.com/q/39193510/518169
【解决方案3】:

我来这里是为了寻找一种在 JavaScript 代码中通用转义 &lt;/script&gt; 的方法。

经过一番研究,我发现如果您试图在 JavaScript 代码中转义 &lt;/script&gt; 以便它可以安全地嵌入到 html 中的 &lt;script&gt;&lt;/script&gt; 标签之间,您应该将 &lt;/script 替换为 &lt;/scr\ipt&lt;/scri\pt。这样做更安全,因为如果将其替换为 &lt;\/script,您可能会破坏 JavaScript 代码,如下所示:var q = -1&lt;/script/.test("script");

注意不要寻找&lt;/script&gt;,而是寻找&lt;/script,因为&lt;/script asdasdas&gt; 会像&lt;/script&gt; 一样结束您的脚本。

抱歉,它对 OP 没有任何帮助。接受的答案是绝对正确的,您需要知道&lt;script&gt;&lt;/script&gt; 中的语言中哪些结构是合法的,才能知道如何在不中断代码的情况下转义&lt;/script&gt;

【讨论】:

  • &lt;/script 之间的空格重要吗?
  • @justingordon ' script' 不被视为 javascript 代码的结尾。如果您尝试使用它而不是 '' 来完成您的代码,您将收到语法错误并且 javascript 将无法运行。因此,您无需将代码中的 '' 替换为其他内容,只需 ''
【解决方案4】:

HTML 规范详细解释了允许的内容以及如何安全地转义内容。尤其是考虑到 HTML 的历史,这是一项不平凡的任务。

来自 HTML 规范:

避免本节中描述的相当奇怪的限制的最简单和最安全的方法是始终将“&amp;lt;!--”转义为“&amp;lt;\!--”、“&amp;lt;script”转义为“&amp;lt;\script”和“@987654326”当这些序列出现在脚本的文字中(例如,在字符串、正则表达式或 cmets 中)时,@" 为 "&amp;lt;\/script",并避免编写在表达式中使用此类结构的代码。这样做可以避免本节中的限制容易触发的陷阱:即,由于历史原因,在 HTML 中解析脚本块是一种奇怪而奇特的做法,在面对这些序列时会以不直观的方式行事。

来源:https://www.w3.org/TR/html52/semantics-scripting.html#restrictions-for-contents-of-script-elements

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    相关资源
    最近更新 更多