• 解析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字符不做解析。
  • 相关阅读:
    Mysql存储引擎
    数据库事务的四大特性以及事务的隔离级别
    万万没想到,面试中,连 ClassLoader类加载器 也能问出这么多问题
    万万没想到,JVM内存区域的面试题也可以问的这么难?
    SQL Server读取及导入Excel数据
    SQL Server加密与解密
    线程之间如何通信
    mybatis 批量更新 批量添加
    vue echarts 从后台获取数据形成饼图,柱状图,折线图
    vue 视频播放
  • 原文地址:https://www.cnblogs.com/muse/p/1806083.html
Copyright © 2020-2023  润新知