17

PHP の DOMDocument を使用してloadHTML、コンテンツを解析するメソッドを使用してユーザーが送信した HTML を解析および正規化し、次の方法で整形式の結果を取得していますsaveHTML

$dom= new DOMDocument();
$dom->loadHTML('<div><p>Hello World');
$well_formed= $dom->saveHTML(); 
echo($well_formed);

これにより、フラグメントが解析され、適切な終了タグが追加されます。問題は、、、、など<!DOCTYPE>の不要なタグも大量に取得していることです。すべての適切な形式の HTML ドキュメントにはこれらのタグが必要であることは理解していますが、正規化する HTML フラグメントは既存の有効なドキュメントに挿入されます。<html><head><body>

4

4 に答える 4

26

問題の簡単な解決策は、xPath式を使用して本体を取得することです。

$dom= new DOMDocument();
$dom->loadHTML('<div><p>Hello World');      
$xpath = new DOMXPath($dom);
$body = $xpath->query('/html/body');
echo($dom->saveXml($body->item(0)));

ここに警告の言葉。loadHTMLは、形式が正しくないHTMLドキュメントに遭遇すると、警告をスローすることがあります。この種のHTMLドキュメントを解析する場合は、より優れたhtmlパーサー[自己リンク警告]を見つける必要があります。

于 2010-02-27T00:52:34.893 に答える
3

あなたのケースでは、HTML ドキュメントではなく、HTML フラグメント (HTML コードの一部) で作業したいと考えています。これは、DOMDocument が必要なものではないことを意味します。

代わりに、HTMLPurifier (quoting)のようなものを使用したいと思います。

HTML Purifier は、PHP で書かれた標準準拠の HTML フィルター ライブラリです。HTML Purifier は、完全に監査された安全で許容的なホワイトリストを使用してすべての悪意のあるコード (XSS として知られている) を削除するだけでなく 、ドキュメントが標準に準拠していることを確認します

そして、コードの一部を試してみると:

<div><p>Hello World

HTMLPurifierのデモ ページを使用すると、このクリーンな HTML が出力として得られます。

<div><p>Hello World</p></div>

ずっといいですね。;-)

(HTMLPurfier は幅広いオプションをサポートしていることに注意してください。また、そのドキュメントを見ても害はないかもしれません)

于 2010-02-27T00:21:12.900 に答える
1

同じ問題に直面して、SmartDOMDocument と呼ばれる DOMDocument のラッパーを作成して、これと他のいくつかの欠点 (エンコードの問題など) を克服しました。

ここで見つけることができます: http://beerpla.net/projects/smartdomdocument

于 2010-03-12T10:01:18.630 に答える