php – 如何实现DOM解析器?

前端之家收集整理的这篇文章主要介绍了php – 如何实现DOM解析器?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的经验告诉我 one should not use RegExp to parse HTML/XML,我完全同意!它的

>凌乱
>不健壮,容易破碎
>纯粹的邪恶

他们都说某种“使用DOM解析器”,这对我来说很好.但现在我很好奇.这些如何运作?

我正在搜索DOMDocument类源,但找不到它.

这个问题来自于例如filter_var()被认为是使用RegExp验证电子邮件的一个很好的选择,但是当你查看源代码时,你会发现它实际上使用了RegExp本身!

那么,如果你要在PHP中构建DOM解析器?你会如何解析HTML?他们是如何做到的呢?

我想你应该查看文章 How Browsers Work: Behind the Scenes of Modern Web Browsers.这是一个冗长的阅读,但值得你花时间.具体来说,HTML Parser部分.

虽然我不能把文章公正化,但是在他们有时间阅读和消化那个杰作之前,或许粗略地总结一下.我必须承认,在这方面,我是一个很少有经验的新手.专业地为网络开发了大约10年之后,浏览器处理和解释代码的方式一直是个黑盒子.

HTML,XHTML,CSS或JavaScript – 随你挑选.他们都有语法和词汇.英语是另一个很好的例子.我们有语法规则,我们希望人们,书籍和其他人遵循.我们还有一个由名词,动词,形容词等组成的词汇.

浏览器通过检查文档的语法及其词汇来解释文档.当遇到它最终无法理解的项目时,它会让你知道(提出异常等).你和我做同样的事情.

I love StackOverflow,but if I could changed one thing it would be be absolutamente broken…

请注意,在上面的示例中,您将立即开始挑选单词之间的单词和关系.一开始就完全有道理,“我喜欢StackOverflow.”然后我们来“……如果我能改变”,我们立即停止. “已更改”不属于此处.作者很可能意味着“改变”.现在词汇表是对的,但语法错了.不久之后,我们遇到了“be be”,这也可能违反了语法规则,而且我们还会进一步遇到“absolutamente”这个词,它不是英语词汇的一部分 – 另一个错误.

从DOCTYPE的角度考虑所有这些.我现在在我的第二台显示器上打开了XHTML 1.0 Strict Doctype背后的源代码.它的内部结构如下所示:

<!ENTITY % heading "h1|h2|h3|h4|h5|h6">

这定义了标题实体.只要我遵守XHTML的语法,我就可以在我的文档中使用其中任何一个(< h1> Hello World< / h1>).但是如果我试着说一个,比如说H7,那么浏览器会在词汇上绊倒“外国人”,并通知我:

“Line 7,Column 8: element “h7″ undefined”

也许在解析文档时我们遇到了< table.我们知道我们现在正在处理一个表元素,它有自己的词汇集,如tbody,tr等.只要我们知道语言,语法规则等,我们就知道什么时候出错了.回到XHTML 1.0 Strict Doctype,我们发现以下内容

<!ELEMENT table
     (caption?,(col*|colgroup*),thead?,tfoot?,(tbody+|tr+))>
<!ELEMENT caption  %Inline;>
<!ELEMENT thead    (tr)+>
<!ELEMENT tfoot    (tr)+>
<!ELEMENT tbody    (tr)+>
<!ELEMENT colgroup (col)*>
<!ELEMENT col      EMPTY>
<!ELEMENT tr       (th|td)+>
<!ELEMENT th       %Flow;>
<!ELEMENT td       %Flow;>

鉴于此引用,我们可以对我们正在解析的任何源进行运行检查.如果作者写的是踏板,而不是thead,我们有一个标准,通过它我们可以确定是错误的.如果问题没有得到解决,我们找不到匹配某些语法和词汇用法的规则,我们会通知作者他们的文档无效.

我绝不是在做这种科学正义,但是我希望这有助于 – 如果没有更多 – 足以让你在自己内部找到它并坐下阅读作为这个答案的开头引用的文章,也许坐下来并研究我们每天遇到的各种DTD.

猜你在找的PHP相关文章