解析HTML前期准备工作备忘

前段时间写了一个html解析程序,主要用途是清理用户使用在线编辑器不当时产生的无用代码。这种清理工作单靠正则完成非常困难,因为客户端情况的不可知是绝对的。但后来该项目因为其他原因暂缓,为防止重新启动时接不上茬,把开发过程中的一些琐碎事项记录备忘。

HTML非常松散。虽然xhtml强制xml规范的推广,但遵守何种规范构造web页绝对是一相情愿就足够的事。也正因为如此,在html5有关技术规范发布以后,xhtml处境相当尴尬。有些我们平习以为常的规则,比如属性分属性名/值两部分并用等号分割,属性值在右侧并用双引号封闭;比如标签必须封闭;比如html的命名空间等等,这些都是xhtml的规范要求,请与html规范区分开。如果我们使用类似fck的网页编辑器,尤其是早期版本,至少ie浏览器不会按照xhtml规范来生成代码。所以如果我们不想让用户编辑完后看到的东西和最初出入太大的话,解析程序必须以html作为解析规范。

HTML三条规则;其他一些特殊字符也只有在此基础上,才会对html语义的判断起到作用。

  1. (<)(我称之为“左尖括号”,简称“左尖”)为标签的开始;
  2. (>)(右尖)为标签的结束;
  3. 左尖之后必须为字符、'/'、'!',否则左尖无效,忽略为文字。

几个特殊字符:单引号(')、双引号(")、左斜杠(/)和叹号(!):

  1. 左斜杠判断标签类型。左斜杠出现在左尖后,则标签为一个环绕标签的封闭标签,比如<p>...</p>;出现在右尖前,则标签是一个单独封闭标签,比如<img /> <br />。有些特殊标签可以环绕封闭也可以单独封闭,并且封闭时不强求有左斜杠,比如<p />、<p><p>、<br />、<br>等等。
  2. 单、双引号的判断属性。单双引号用于环绕属性值,可以不加,但若加了则必须成对,否则会造成标签破损无法解析。属性有可能只有名,比如<input type="button" disabled />
  3. 左斜杠后为叹号(!)的,有两种标签:DOCType声明和注释。这两种标签在任何规范下都是不用左斜杠(/)封闭的。
  4. 容错:由于手头没有相关技术资料,我只能自己写一些坏的html代码在浏览器里测试,归纳了下面几点:
  5. 当遇到左尖时,peek下一个字符做判断:如果是英文字符或者左斜杠、叹号,则该左尖为标签开始标记,否则是文本。当遇到多个左尖重复时,如下面代码:
<a href=# title=Enter>>>Enter<<</a>

通过判断下一个字符的情况,很容易看出archor的封闭标记将在'/'之前最后一个左尖开始

如果由一个左尖已经被认定为标签开始标记,后面的读取有若干情况:

  1. 没有任何干扰和歧义,顺利读取属性完毕,逢第一个右尖结束标记。在下一个左尖认定前,进行文本的读取。
  2. 属性标记中使用了引号,比较复杂:
    1. 如果引号没有配对封闭,FireFox3.6将尝试查找第一个右尖封闭标签;
    2. 如果引号配对封闭了,但是在下一个左尖之前没有右尖封闭出现,FireFox3.6则在该配对引号的封闭处结束该标签。
    3. 如果引号没有配对封闭,并且全文结束前没有右尖出现,则全文结束处封闭标签,其内中所有标记正常的属性均可起作用,FireFox3.6。
    4. 如果是FireFox4.x beta或者chrome,只要标签中存在引号没有配对封闭的属性,无条件停止解析。
    5. 引号配对封闭的属性值中的html字符不做解析。
原文地址:https://www.cnblogs.com/muse/p/1806083.html