在什么范围内需要转义特殊的HTML字符?

时间:2014-01-24 22:24:51

标签: html html-escape-characters

在HTML中,

<a HREF="http://...... & .... ">Dust & Bones</a>

needs to be escaped as follows

<a href="http://...... &amp; .... ">Dust &amp; Bones</a>

需要应用&amp的范围是什么。它只是href还是HTML文本中的任何地方?

怎么样?
<input value="http://... & ">?

<script>... & ... </script>

这些需要逃避吗?


更新

更大的问题,可以解释这一点,HTML解析器何时查找&amp; XXX;代币并替换它们?它是在整个文档中完成一次,还是对标记内的标记与属性值之间的文本应用不同的规则与wihtin tagA相对于tagB内部 - 不同的解析规则似乎适用于内部,因此我可以编写&amp; &安培; (对于AND)和&lt;为(少)。那么,哪些规则适用于哪个范围?

1 个答案:

答案 0 :(得分:2)

规则因您正在处理的HTML版本而异,但总是更复杂,值得尝试记住。

安全的方法是“使用字符引用来代表除了内部脚本和样式元素之外的所有地方的5个HTML特殊字符”,这使得除了XHTML之外的所有内容都是安全的。

对于XHTML,规则与“并在脚本和样式元素中使用显式CDATA部分”的附加条件相同。


  

更大的问题可以解释这个问题,HTML解析器何时查找&XXX;令牌并替换它们?

因为它解析HTML(取决于令牌器的当前状态(“内部开始标记”和“内部属性值”是不同状态的示例))。

  

是否在整个文件中完成了一次

除非您触发其他HTML解析(例如,通过在元素上设置innerHTML)。

  

或不同的规则适用于代码中的代码与属性值之间的文本与wihtin tagA和tagB内的属性值

不同的规则适用于不同的地方。完整的当前规则(正如我在评论中所建议的那样)相当复杂,需要从HTML 5 parsing rules中提取大量工作。这就是为什么我建议,如果您是HTML作者而不是浏览器作者,使用更简单的规则“使用字符引用,除非您在脚本或样式元素中”。

  

- 不同的解析规则似乎适用于<script>,因此我可以为{LESS-THAN}编写&&(对于AND)和<。那么,哪些规则适用于哪个范围?

在HTML 4术语中,scriptstyle元素被定义为包含CDATA(其中HTML中具有特殊含义的唯一字符序列是</,它终止了CDATA部分)。文档中的其他任何位置(包括,反直觉地,定义为包含CDATA的属性值)&表示字符引用的开始(尽管可能存在一些基于{{之后的字符)的例外情况。 1}}是)。

HTML 5规则更复杂,但基本原则是“使用&&<>的字符引用是安全和理智的和"除了脚本和样式元素之外的所有地方“持有。