解析HTML前期准备工作备忘
16lz
2021-01-22
前段时间写了一个html解析程序,主要用途是清理用户使用在线编辑器不当时产生的无用代码。这种清理工作单靠正则完成非常困难,因为客户端情况的不可知是绝对的。但后来该项目因为其他原因暂缓,为防止重新启动时接不上茬,把开发过程中的一些琐碎事项记录备忘。
HTML非常松散。虽然xhtml强制xml规范的推广,但遵守何种规范构造web页绝对是一相情愿就足够的事。也正因为如此,在html5有关技术规范发布以后,xhtml处境相当尴尬。有些我们平习以为常的规则,比如属性分属性名/值两部分并用等号分割,属性值在右侧并用双引号封闭;比如标签必须封闭;比如html的命名空间等等,这些都是xhtml的规范要求,请与html规范区分开。如果我们使用类似fck的网页编辑器,尤其是早期版本,至少ie浏览器不会按照xhtml规范来生成代码。所以如果我们不想让用户编辑完后看到的东西和最初出入太大的话,解析程序必须以html作为解析规范。
HTML三条规则;其他一些特殊字符也只有在此基础上,才会对html语义的判断起到作用。
- (<)(我称之为“左尖括号”,简称“左尖”)为标签的开始;
- (>)(右尖)为标签的结束;
- 左尖之后必须为字符、'/'、'!',否则左尖无效,忽略为文字。
几个特殊字符:单引号(')、双引号(")、左斜杠(/)和叹号(!):
- 左斜杠判断标签类型。左斜杠出现在左尖后,则标签为一个环绕标签的封闭标签,比如<p>...</p>;出现在右尖前,则标签是一个单独封闭标签,比如<img /> <br />。有些特殊标签可以环绕封闭也可以单独封闭,并且封闭时不强求有左斜杠,比如<p />、<p><p>、<br />、<br>等等。
- 单、双引号的判断属性。单双引号用于环绕属性值,可以不加,但若加了则必须成对,否则会造成标签破损无法解析。属性有可能只有名,比如<input type="button" disabled />
- 左斜杠后为叹号(!)的,有两种标签:DOCType声明和注释。这两种标签在任何规范下都是不用左斜杠(/)封闭的。
- 容错:由于手头没有相关技术资料,我只能自己写一些坏的html代码在浏览器里测试,归纳了下面几点:
- 当遇到左尖时,peek下一个字符做判断:如果是英文字符或者左斜杠、叹号,则该左尖为标签开始标记,否则是文本。当遇到多个左尖重复时,如下面代码:
<a href=# title=Enter>>>Enter<<</a>
更多相关文章
- 如何控制html代码中DL标签的颜色?
- 当将带有撇号的单词保存到数据库时,mysql_real_escape_string会添
- PHP DOMNode:如何不仅提取文本,而且提取HTML标签
- 有没有办法在php关闭标签后强制换行?>什么时候嵌入html?
- 使用pregex提取最后2个斜杠之间的内容
- PHP替换标签字符
- 如何从标准化表中获取最流行的标签?
- 连接相关标签的最佳数据库设计
- 屏蔽标签的href跳转功能