5

HTML に似た古いドキュメントがたくさんあります。のように、それらは HTML のように見えますが、HTML の一部ではない追加の作成されたタグがあります

<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 メソッドを探していた理由です。

4

6 に答える 6

7

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

于 2010-08-31T21:22:45.777 に答える
2

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

于 2008-09-15T20:50:03.753 に答える
1

PHP Fit ポートのパーサーを見てください。コードはクリーンで、元々は 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

于 2008-09-15T21:31:16.977 に答える
1

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

整形式のファイルを取得したら、XML パーサーを調べ始めることができます。その前に SOL Lok Alejo は、HTML TIDYを調べることができると言いましたが、それは HTML に固有のもののようです。カスタム要素でどうなるかわかりません。

ここでは、正規表現が有効な解決策であるとは考えていません

整形式になるまでは、それが唯一の選択肢かもしれません。ドキュメントをその段階まで取得すると、DOM 機能を明確に理解できます。

于 2008-09-15T21:23:40.740 に答える
0

@アランストーム

私の他の答えに対するあなたのコメントは私に考えさせました:

DOMDocumentを使用してHTMLファイルをロードすると、ある程度のクリーンアップが行われているように見えます。整形式ですが、すべてのタグが正当なHTMLタグである必要があります。前者を実行するものを探していますが、後者は実行しません。(アランストーム)

タグに対して正規表現(申し訳ありません!)を実行し、有効なHTML要素ではないものが見つかったら、どのドキュメントにも存在しないことがわかっている有効な要素に置き換えます(blink頭に浮かぶ... )、不正な要素の名前を持つ属性値を指定して、後で元に戻すことができるようにします。例えば:

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

明らかにそのコードは機能しませんが、あなたは一般的な考えを理解しますか?

于 2008-09-16T04:28:17.880 に答える
0

この問題に対する私の手っ取り早い解決策は、カスタム タグのリストと正規表現を照合するループを実行することでした。正規表現は、内部に別のカスタム タグがあるタグをキャッチしません。

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

一致する子のないカスタム タグがなくなると、ループは終了します。全体として、反復的 (while ループ) であり、再帰的ではありません。

于 2008-09-15T22:41:11.567 に答える