HTML 语言是从 SGML 衍生来的,HTML 的「注释」语法也就应该跟 SGML 的「注释」是一致的。实际上,它们之间却有一些的差异。
SGML 是这样定义「注释」的:
「注释」以
<!开始,以>结束,中间可以有零个或多个注释块。每个「注释块」以--开始,并以--结束,并且其中不能包含--。
下面是一些合法的 SGML 「注释」:
<!-- Hello --><!-- Hello -- -- Hello--><!----><!------ Hello --><!>
我们可以看到,注释可以为空,只有对称的两个 – 。同样,<!>也是合法的,它不包含任何「注释块」。
<!------> hello--> 按照 SGML 是合法的,但却不是一个合法的 HTML 注释。这条注释包含了两个「注释块」,其一为: ---- ;其二为: --> hello--; 它们都被 – 包裹,所以是合法的 SGML 注释。而如果用浏览器查看,会显示出 hello--> 。
我们再来看一下 W3C 对 「HTML 注释」的定义。
在 HTML4.01 中定义如下:
「注释标记」的以
<!开始,以>作为结束,注释内容以--开始,以--结束。<!--之间不能有空格,而-->之间可以有空格。
可能是为了遵循 SGML 对注释的定义,W3C给出了这么一个纠结的说法。并提醒网页制作者避免在注释内容中出现两个或两个以上的连字符(-) 。对了,W3C 不忘强调 「注释」 是一个标记(Note that comments are markup)。
而在 HTML5 中,W3C 清晰地给出了注释的语法:
「注释」必须以四个连续的字符:
<!--开始,以三个连续的字符-->结束。注释内容不能以小于号>或者连字符加大于号->开始;注释内容中间部分不能包含两个连续的连字符(--),注释内容不能以连字符(-)作为结束。
一些实际测试结果:
<!hello world>所有浏览器都会将其解析为注释;(天哪,两个连字符竟然不是必须的!)-
<!-hello world>所有浏览器都会将其解析为注释; -
<!--hello world>IE会将其识别为一个注释,其后的内容可以显示。其他浏览器(Firefox、Chrome、Opera)则会将这条注释后边的所有内容都视为注释内容而不显示出来。 <!-- -- helo world>结论同上。<!-- hello world> rpsh.net <!-- -->或者<!-- -- hello world> rpsh.net <!-- -->在所有浏览器中 rpsh.net 都不会显示出来<!-- -- --> rpsh.net <!-- -- -->或者<!-----> rpsh.net <!----->在所有浏览器中 rpsh.net 都可以显示出来。<!---> rpsh.net <!--->在 Opera 中 rpsh.net 不会显示,其他浏览器中rpsh.net 都可以显示。<!-- <! rpsh.net -->所有浏览器都将其解析为一条注释,其后的内容可以正常显示。<!-- -- > rpsh.net -->Opear 中会显示出rpsh.net -->,其他浏览器都将其解释为一条注释,其后的内容正常显示。<!-- > rpsh.net -->所有浏览器都将其解析为一条注释,其后的内容可以正常显示。<!-- hello world <!-- rpsh.net -->所有浏览器都将其解析为一条注释,其后的内容可以正常显示。<!-- -->hello world<!-- >rpsh.net<!-- -->所有浏览器中 hello world 显示,rpsh.net不显示。
从这些实验结果,我们可以得出以下结论:
- 对于所有浏览器
<! >即可声明一条注释,注释内容不必用--包裹。 - 注释内容中一旦以
--开始,则注释内容中就不应当出现-->,否则将会视其为注释的结束标记。
参考链接:
http://htmlhelp.com/reference/wilbur/misc/comment.html
http://www.w3.org/TR/html401/intro/sgmltut.html#h-3.2.4
http://www.w3.org/TR/html5/syntax.html#comments
http://www.howtocreate.co.uk/SGMLComments.html