2008-09-15 6 views
4

私はHTMLのようなレガシードキュメントをたくさん持っています。以下のように、彼らは、HTMLのように見えるが、私はこれらのファイルを解析する必要がHTMLPHPで許容されるエラーのあるHTML/XML/SGML構文解析

<strong>This is an example of a <pseud-template>fake tag</pseud-template></strong> 

の一部ではない追加の構成されたタグを持ちます。利用可能な唯一のツールはPHPです。ドキュメントは整形式のXMLに近いものにはなりません。

私の元々の考えは、PHP DOMDocumentでloadHTMLメソッドを使用することでした。しかし、これらのメソッドは、HTMLタグを補うことを詰まらせ、文字列/ファイルの解析を拒否します。

$oDom = new DomDocument(); 
$oDom->loadHTML("<strong>This is an example of a <pseud-template>fake tag</pseud-template></strong>"); 
//gives us 
DOMDocument::loadHTML() [function.loadHTML]: Tag pseud-template invalid in Entity, line: 1 occured in .... 

私が思い付くことができました唯一の解決策は、無効なタグを削除し、有効なHTMLタグ(と多分スパンでそれらを置き換えます文字列置換機能を持つファイルを事前処理することですタグ名のid)。

もっと洗練されたソリューションはありますか? DOMDocumentに、有効と見なされる追加のタグについて知る方法? PHPのための異なる、堅牢なHTML解析クラス/オブジェクトがありますか?

(それは明白でなければ、私は正規表現にここで、有効な解決策を考慮していない)

更新:偽のタグに記載されている情報は、ここでの目的の一部であるので、Tidyのようなものではありませんオプション。また、私は整形式のクリーンアップのレベルではないにしても、ある程度レベルを上回っているので、最初はDomDocumentのloadHTMLメソッドを探していたのです。

答えて

5

libxml_use_internal_errorsで警告を抑制することができます。例えば:

libxml_use_internal_errors(true); 
$doc = new DomDocument(); 
$doc->loadHTML("<strong>This is an example of a <pseud-template>fake tag</pseud-template></strong>"); 
libxml_use_internal_errors(false); 

何らかの理由で、あなたは警告にアクセスする必要がある、場合、libxml_get_errors

+3

あなたは数週間待っていたはずです、あなたは2年後のバッジ "正しい答え"を得ている可能性があります! –

+0

arh ..なぜ私はそれを知りませんでした:) – troelskn

+0

無効なタグをスキップする方法はありますか? –

2

「悪い」HTMLをHTML Tidyに渡すと、最初のパスとして役立つかもしれませんか?見た目には価値があるかもしれませんが、ドキュメントをうまく作成できれば、DomDocumentで通常のXMLファイルとして読み込むことができます。

+0

謝罪を使用し、私はより具体的なされている必要があり、私はファイルから解析するために必要なものの一部は何であります偽のタグで見つかった –

+0

HTMLTidyを整形して、整形式のXMLを手に入れることを提案しました.DomDocumentで解析し、DOM全体を読むことができます:) –

+0

偽のマークアップとすべての再フォーマットを整理しませんします? –

1

@Twan カスタムXMLを解析するためにDOMDocumentのDTDは必要ありません。 DOMDocument->load()を使ってください。XMLが整形式である限り、それを読むことができます。

ファイルが整形されると、その時点でXMLパーザーを見ることができます。その前に、あなたはS.O.Lです。 Lok AlejoはHTML TIDYを見ることができますが、それはHTML特有のように見えますが、カスタム要素をどのように使うのかわかりません。

私はあなたが整形持ってまで、それはあなたの唯一のオプションであるかもしれないここ

正規表現に有効な解決策を考慮していません。その段階に至るまでドキュメントを入手すると、DOM機能が明確になります。

+0

DOMDocumentでHTMLファイルを読み込むと、ある程度のクリーンアップが行われているように見えます。うまく整形されていれば、すべてのタグが正当なHTMLタグである必要があります。私は前者を行うものを探していますが、後者はしません。 –

1

PHP FitポートのParserを見てください。コードはきれいで、もともとWordで保存された汚れたHTMLを読み込むために設計されています。テーブルを引き出すように構成されていますが、簡単に指示できます。

あなたがここにソースを見ることができます: http://gerd.exit0.net/pat/PHPFIT/PHPFIT-0.1.0/Parser.phps

ユニットテストは、それを使用する方法を紹介します: http://gerd.exit0.net/pat/PHPFIT/PHPFIT-0.1.0/test/parser.phps

+0

これは現在どこにもリンクされていません。 – hakre

0

この問題への私の迅速かつ汚いソリューションは私に一致するループを実行することでした正規表現によるカスタムタグのリストregexpは内部に別の内部カスタムタグを持つタグを捕捉しません。

一致がある場合、そのタグを処理する関数が呼び出され、処理されたHTMLが返されます。そのカスタムタグが、実際のHTMLが子の代わりに挿入され、正規表現によってマッチされ、ループの次の繰り返しで処理されるという事実によって、親が子なしになるという別のカスタムタグ内にある場合。

マッチする子のカスタムタグが存在しない場合、ループが終了します。全体的にiterative(whileループ)であり、再帰的ではありません。

0

@Alanストーム

は私の他の回答にコメントが思考に私を得た:

をあなたがのDOMDocumentとHTMLファイルをロードすると、クリーンアップ再いくつかのレベルを行うに表示されます。よくよくしかし、すべてのタグを正当なHTMLタグにする必要があります。私は前者を行うものを探していますが、後者はしません。 (Alan Storm)

有効なHTML要素ではない正規表現を見つけたら、存在しないことがわかっている有効な要素に置き換えます文書(blinkが頭に浮かんでいます...)を作成し、それに不正な要素の名前を持つ属性値を与えて、後でそれを元に戻すことができます。例:

$code = str_replace("<pseudo-tag>", "<blink rel=\"pseudo-tag\">", $code); 
// and then back again... 
$code = preg_replace('<blink rel="(.*?)">', '<\1>', $code); 

明らかに、このコードは機能しませんが、一般的な考えはありますか?

関連する問題