内容摘要:写html页面解析,本质上是把一段字符串变成一棵树。这棵树叫DOM树,浏览器就是靠它来渲染页面的。但你要是自己动手写解析器,就得从最底层开始琢磨。 拿最简单的例子说,`Hello`。肉眼一看就俩部分:
写html页面解析,何解本质上是代码把一段字符串变成一棵树。这棵树叫DOM树,何解
浏览器就是代码靠它来渲染页面的。但你要是何解自己动手写解析器,就得从最底层开始琢磨。代码 拿最简单的何解例子说,`
Hello
`。代码肉眼一看就俩部分:标签和文本。何解但代码层面,代码你得先找到那个尖括号,何解
再看它后面跟的代码是不是字母,接着读属性,何解读到`>`才算标签结束。代码这中间任何一步出错,何解比如少了引号,或者属性值里有空格,都会让解析器懵圈。 我见过不少新手上来就写正则表达式去匹配html。坦白讲,对付小片段还行,但真实网页根本是另一码事。比如`

`,这里面的`>`在属性值里是合法的,正则一抓就错。再碰上嵌套的`
`这种不规范的写法,正则直接崩溃。所以正经做法是逐字符扫描,用一个状态机来记录当前在标签内还是文本内。 状态机的核心就几个状态:数据态、标签开始态、标签名态、属性态、自闭合态。每读一个字符,根据当前状态决定下一步去哪。比如读到`<`,如果当前在数据态,就切换到标签开始态;如果再读到字母,就进标签名态。这套逻辑写出来,其实就几十行代码,但得把边界情况想清楚。 解析完标签结构,还得处理文本节点。文本有个坑:转义字符。`<`是小于号,`&`是&号。你要是直接按原样存,后面渲染就错了。所以解析文本时得建一个映射表,把实体转成真实字符。顺便说一句,`