在HTML中,标记和实体未在<script>
标记内解析,</
会立即结束标记。因此,
<script><b>fun & things</
会为您提供一个包含确切内容<b>fun & things
的脚本标记。
如果您要包含JSON,并且希望在脚本中包含字符</
,则可以将其替换为<\/
,因为这些字符出现的唯一位置是字符串,并且\/
是一个转义为单个正斜杠的转义序列。
但是,如果你没有使用JavaScript,那么这个技巧就行不通了。在我的情况下,我特意尝试在源中插入<script type="math/tex">
,以便MathJax处理它。有没有办法在原始HTML源代码中转义</
? (我并不特别需要</
,但我正在编写一个通用工具,并希望能够使用任何文本。)
(可以在JavaScript中创建脚本标记并填充其innerText
,但我正在处理原始HTML,所以我不能这样做。)
答案 0 :(得分:18)
我来到这里寻找一种在JavaScript代码中普遍转义</script>
的方法。
经过一番研究后,我认为如果您试图在JavaScript代码中转义</script>
,以便可以安全地嵌入<script>
和</script>
代码之间的html中,则应该替换{{ 1}} </script
或</scr\ipt
。这样做更安全,因为如果用</scri\pt
替换它,可能会破坏这样的JavaScript代码:<\/script
小心不要寻找var q = -1</script/.test("script");
,而是</script>
,因为</script
会像</script asdasdas>
一样结束你的脚本。
对不起,它对Ben Alpert没有任何帮助。接受的答案绝对正确,您需要知道</script>
内的语言中哪些结构是合法的,以了解如何在不制动代码的情况下逃避<script></script>
出现。
答案 1 :(得分:6)
在HTML中,与XHTML相反,script
元素的内容作为纯文本处理,除了结束标记的出现,因此</
结束处理并且必须符合文档,开始结束标记</script>
。没有一般机制可以避免这种情况。任何绕过此功能的方法都不可避免地依赖于元素内部使用的“语言”。 “语言”这个词在这里引用,因为只要你的代码可以解析和处理它,内容就可以是任何东西。
所以:没有通用机制,但对于JavaScript以外的内容或某些浏览器认可的其他一些客户端脚本语言,您可以制定自己的规则。
答案 2 :(得分:0)
更多HTML编码可能会有所帮助? <
的{{1}}。
很难知道你在做什么。如果您不确定脚本标记之间的内容可能是什么(看起来您可能尝试将其用作某种模板持有者?)那么您可以/应该使用CDATA部分:
<
应该这样做。更多描述也可以帮助提供更好的答案:)
答案 3 :(得分:0)
HTML规范详细说明了允许的内容以及如何安全地转义内容。特别是考虑到HTML的历史,这是一项艰巨的任务。
根据HTML规范:
避免本节中描述的奇怪限制的最简单,最安全的方法是始终将“
<!--
”换成“<\!--
”,将“<script
”换成“ {{1” }}”和“<\script
”中的“</script
”作为“<\/script
”时,这些序列出现在脚本文字中(例如,字符串,正则表达式或注释中),并避免编写使用此类构造的代码在表达式中。这样做避免了本节中的限制容易触发的陷阱:即,由于历史原因,HTML脚本块的解析是一种奇怪而奇特的做法,在面对这些序列时会不直观地进行操作。
来源:https://www.w3.org/TR/html52/semantics-scripting.html#restrictions-for-contents-of-script-elements