前段时间写了一个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>

      更多相关文章

      1. 如何控制html代码中DL标签的颜色?
      2. 当将带有撇号的单词保存到数据库时,mysql_real_escape_string会添
      3. PHP DOMNode:如何不仅提取文本,而且提取HTML标签
      4. 有没有办法在php关闭标签后强制换行?>什么时候嵌入html?
      5. 使用pregex提取最后2个斜杠之间的内容
      6. PHP替换标签字符
      7. 如何从标准化表中获取最流行的标签?
      8. 连接相关标签的最佳数据库设计
      9. 屏蔽标签的href跳转功能

      随机推荐

      1. php中carbon如何转成时间戳
      2. PHP中常用header头汇总
      3. PHP让人不知道的匿名函数的几种写法(附代
      4. 如何在php中实现construct构造方法
      5. PHP中三种设置脚本最大执行时间的方法
      6. 在PHP中通过GD库创建简单的图片(图文详解)
      7. 如何将curl获取到的json对象转成数组
      8. php如何修改数组的值?
      9. PHP在图片中用 imagettftext() 添加水印(
      10. 如何解决php中curl传递数据太慢