Php DOM解析器是如何实现的?

Php DOM解析器是如何实现的?,php,dom,Php,Dom,我的经验告诉我,我完全同意!它是 凌乱 不结实,不易破碎 纯粹的邪恶 他们都说“使用DOM解析器”,这对我来说很好。但现在我开始好奇了。这些是如何工作的 我正在搜索DOMDocument类源代码,但找不到它 这个问题来自这样一个事实:例如,filter\u var()被认为是使用RegExp验证电子邮件的一个好选择,但是当您查看源代码时,您会发现它实际上使用了RegExp本身 那么,如果要用PHP构建DOM解析器?您将如何解析HTML?他们是怎么做到的?好消息就在这里,你不需要重新发明轮子。

我的经验告诉我,我完全同意!它是

  • 凌乱
  • 不结实,不易破碎
  • 纯粹的邪恶
他们都说“使用DOM解析器”,这对我来说很好。但现在我开始好奇了。这些是如何工作的

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

这个问题来自这样一个事实:例如,
filter\u var()
被认为是使用RegExp验证电子邮件的一个好选择,但是当您查看源代码时,您会发现它实际上使用了RegExp本身


那么,如果要用PHP构建DOM解析器?您将如何解析HTML?他们是怎么做到的?

好消息就在这里,你不需要重新发明轮子。在PHP的DOMDocument扩展中使用,其源代码可用。我建议

顺便说一句,正则表达式并不总是错误的,但是你需要正确地使用它们。其他人你直接进入地狱厨房,成为一个小猫连环杀手,或者访问Chutulu,或者如何称呼那个家伙。因此,我建议如下:


但是如果你做的每件事都是正确的,正则表达式可以在解析方面给你很大的帮助。只是你应该知道你在做什么

我想你应该看看这篇文章。这本书很长,但很值得你花时间。特别是HTML解析器部分

虽然我不能公正地写这篇文章,但也许在他们有时间阅读和消化这部杰作之前,一份粗略的总结将是一件好事。但我必须承认,在这方面我是一个新手,经验很少。在为web专业开发了大约10年之后,浏览器处理和解释我的代码的方式一直是一个黑匣子

HTML、XHTML、CSS或JavaScript——随你选择。他们都有语法和词汇。英语是另一个很好的例子。我们有语法规则,我们希望人们、书籍和更多的人遵守。我们还有一个由名词、动词、形容词等组成的词汇表

浏览器通过检查文档的语法和词汇来解释文档。当它遇到它最终不理解的项目时,它会让您知道(引发异常等)。你和我的共同语言是一样的

我喜欢StackOverflow,但如果我能改变一件事,那就是彻底崩溃

请注意,在上面的示例中,您是如何立即开始分离单词以及单词之间的关系的。一开始,“我爱StackOverflow”,然后我们来到“…如果我能改变”,我们立即停止。“改变”不属于这里。很可能作者的意思是“改变”。现在词汇是对的,但语法是错的。过了一会儿,我们遇到了“be be”,它可能也违反了语法规则,再过一点,我们就遇到了“absolutement”这个词,它不是英语词汇的一部分,这是另一个错误

从DOCTYPE的角度考虑所有这些。我现在已经在第二个监视器上打开了XHTML1.0StrictDocType背后的源代码。在其内部构件中有如下管线:

<!ENTITY % heading "h1|h2|h3|h4|h5|h6">
<!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;>
有了这个引用,我们可以对正在解析的任何源进行运行检查。如果作者写的是
tread
,而不是
thead
,我们就有了一个标准,可以根据这个标准来判断这是错误的。当问题没有解决,我们无法找到与语法和词汇的某些用法相匹配的规则时,我们会通知作者他们的文档是无效的


我决不是在公正地对待这门科学,但是我希望这一点——如果没有更多的话——足以让你找到自己的内心,坐下来阅读这篇作为答案开头的文章,也许坐下来研究我们每天遇到的各种DTD。

DOM解析器通常作为标记器实现。如果您可以阅读C#,则的源代码可以清楚地说明方法。关于
filter_var()
:没有人说过您不应该使用regex验证电子邮件地址。事实上,为这个任务编写一个正确的正则表达式是非常困难的,需要大量的研究工作。所以有成千上万的糟糕的实现。这就是为什么您应该简单地使用
filter\u var()
。如果您使用的是XHTML,一个普通的XML解析器就可以了。我想您应该看看这篇文章。这本书很长,但很值得你花时间。特别是HTML解析器部分。@JonathanSampson:我读过,非常好。如果你能写一个完整的答案,我一定会接受:)就像我说的,我不是想重新发明轮子,我只是好奇轮子是如何工作的。我还试图找到DOMDocument的源代码,但找不到。我链接了libxml的源代码。也可以在他们的网站上看到架构的描述,这个项目相当大。还有htmlpurifier项目,这是一个用PHPIIRC编写的HTML解析器。