为什么这个HTML代码有效?

Gio*_*dze 5 html validation

谁能解释一下,为什么这段代码有效?

 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
    <html<head>
    <title//
    <p ltr<span id=p></span</p>
    </>
Run Code Online (Sandbox Code Playgroud)

我期待收到您的回复.谢谢你的关注

ich*_*ira 5

那些HTML代码是有效的,因为HTML 4.01允许那些东西,而尊重doctype的Internet浏览器将显示它没有问题.

如果将doctype更改为HTML 5,肯定会出错,因为HTML 5对编写正确的HTML标记更为严格.

HTML 4.01(根据https://validator.w3.org/#validate_by_input 没有错误):

 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
    <html<head>
    <title//
    <p ltr<span id=p></span</p>
    </>
Run Code Online (Sandbox Code Playgroud)

HTML 5(根据https://validator.w3.org/#validate_by_input 15错误):

 <!DOCTYPE html>
    <html<head>
    <title//
    <p ltr<span id=p></span</p>
    </>
Run Code Online (Sandbox Code Playgroud)

说明:

该HTML结构是有效的,因为根据HTML 4.0.1规范(https://www.w3.org/TR/1999/REC-html401-19991224/):

B.3.7速记标记

一些SGML SHORTTAG构造节省了类型,但没有为SGML应用程序添加表达能力.虽然这些结构在技术上没有引入歧义,但它们会降低文档的健壮性,特别是当语言被增强以包含新元素时.因此,尽管广泛使用和实现了与属性相关的SGML的SHORTTAG构造,但是与元素相关的构造不是.使用它们的文档符合SGML文档,但不太可能与许多现有的HTML工具一起使用.

有问题的SHORTTAG结构如下:

  • NET标签:
    <name/.../
  • 关闭开始标记:
    <name1<name2>
  • 空开始标记:
    <>
  • 空结束标记:
    </>

引用自https://www.w3.org/TR/1999/REC-html401-19991224/appendix/notes.html#hB.3.7.


所以基于HTML 4.01规范,这意味着:

1     <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
2        <html<head>
3        <title//
4        <p ltr<span id=p></span</p>
5        </>
Run Code Online (Sandbox Code Playgroud)
  • 第1行是HTML 4.0.1的有效文档类型.
  • 第2行是有效的<html>开放标记,</html>不需要结束标记.
  • 第2行也是有效的<head>开放标记,</head>不需要结束标记.
  • 第3行是一个有效的<title>开放标记,Internet浏览器<title// <p ltr<span id=p>只是读取<title>,</title>不需要关闭标记.
  • 第4-5行是<title>标签的内容(内部HTML)</span</p> </>(这是因特网浏览器显示为页面的标题).

这是我的另外解释.希望能够帮到你.

  • "那些HTML代码是有效的,因为HTML 4.01允许这些东西" - 你基本上说它是有效的,因为它是有效的,这不是真的非常有帮助. (5认同)