7

私の経験では、 HTML/XMLの解析に正規表現を使用するべきではないことがわかりました。私は完全に同意します。これは

  • 混雑
  • 頑丈ではなく、簡単に壊れます
  • 悪の権化

彼らは皆、ある種の「DOMパーサーを使用する」と言っていますが、それは私にとっては問題ありません。しかし今、私は興味を持ちました。それらはどのように機能しますか?

DOMDocumentクラスのソースを検索していましたが、見つかりませんでした。

この質問は、filter_var()たとえば、RegExpを使用して電子メールを検証するための優れた代替手段と見なされているという事実から来ていますが、ソースを見ると、実際にはRegExp自体を使用していることがわかります。

では、PHPでDOMパーサーを構築する場合はどうでしょうか。HTMLをどのように解析しますか?彼らはどうやってそれをしましたか?

4

2 に答える 2

5

記事「ブラウザのしくみ:最新のWebブラウザの舞台裏」を確認する必要があると思います。長い読み物ですが、時間をかける価値は十分にあります。具体的には、HTMLパーサーセクションです。

私は記事の正義を行うことはできませんが、おそらく大まかな要約は、彼らがその傑作を読んで消化する時間があるまで、1つを保持するのに良いでしょう。しかし、私はこの分野ではほとんど経験のない初心者であることを認めなければなりません。約10年間、専門的にWeb用に開発してきましたが、ブラウザーが私のコードを処理および解釈する方法は、長い間ブラックボックスでした。

HTML、XHTML、CSS、またはJavaScript-選択してください。それらはすべて文法と語彙を持っています。英語はもう一つの素晴らしい例です。人や本などが従うことを期待する文法規則があります。また、名詞、動詞、形容詞などで構成される語彙もあります。

ブラウザは、その文法と語彙を調べることによってドキュメントを解釈します。最終的に理解できない項目に遭遇すると、通知されます(例外の発生など)。あなたと私は共通して同じことをします。

私はStackOverflowが大好きですが、1つ変更できれば、絶対に壊れてしまいます...

上記の例では、単語と単語間の関係をすぐに分解し始める方法に注意してください。最初は完全に理にかなっています、「私はStackOverflowが大好きです」。それから「…変えられたら」に来て、すぐにやめます。「変更」はここに属していません。作者が代わりに「変更」を意味した可能性があります。今では語彙は正しいですが、文法は間違っています。少し後に、文法規則に違反する可能性のある「be be」に出くわし、さらに少し進んで、英語の語彙の一部ではない「absolutamente」という単語に遭遇します。これは別の間違いです。

これらすべてをDOCTYPEの観点から考えてください。私は今、2番目のモニターでXHTML 1.0StrictDoctypeの背後にあるソースを開いています。その内部には、次のような行があります。

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

これは見出しエンティティを定義します。そして、XHTMLの文法に準拠している限り、これらのいずれかをドキュメントで使用できます(<h1>Hello World</h1>)。しかし、私がそれを作り上げようとすると、たとえばH7、ブラウザは「外国語」として語彙につまずき、私に通知します。

"行7、列8:要素"h7"未定義"

おそらく、ドキュメントを解析しているときに遭遇し<tableます。現在、、などの独自の語彙セットを持つ要素を処理していることがわかります。table言語や文法規則などを知っている限り、何かが間違っていることを知っています。XHTML 1.0 Strict Doctypeに戻ると、次のことがわかります。tbodytr

<!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を研究します。

于 2012-05-05T18:25:58.113 に答える
1

良いニュースはここにあります、あなたは車輪を再発明する必要はありません。libxmlライブラリはPHPのDOMDocument拡張機能内で使用され、そのソースコードが利用可能です。私が提案するそこを見てください。

ところで、正規表現は必ずしも間違っているわけではありませんが、他の人が地獄の台所に直行したり、子猫の連続殺人犯になったり、chutulluにアクセスしたり、その男がどのように呼ばれるかを正しく使用する必要があります。したがって、次のことをお勧めします。REX:正規表現を使用したXMLシャローパーサ

しかし、すべてを正しく行うと、正規表現は構文解析に大いに役立ちます。それはあなたが何をしているのかを知っているべきです。

于 2012-05-05T17:14:52.320 に答える