2017-03-19 7 views
2

問題点は次のとおりです。HTMLフラグメントをサーバー側に保存するWebページがあります。問題は、PHPでDOMDocumentパーサを起動し、指定された要素にカスタム属性を追加してHTMLをファイルとして保存すると、実際には有効ではないHTML、本文、およびその他の不要な要素が文字通り追加されるという点ですそのフラグメントはDOMモデル内に挿入されるHTMLフラグメントとしてブラウザに戻ってくるため、無効になります(ネストされたHTML/BODYを持つことはできません)。ここに私のコードの簡単な例です:完全なDOMモデルではなく、HTMLフラグメントとして保存するには

$html="<div><magic></magic> 
<video controls></video> 
    <a href='http://example.com'>Example</a><br> 
    <a href='http://google.com'>Google</a><br></div> 
"; 

$dom = new DOMDocument(); 
$dom->loadHTML($html); 
$html=$dom->C14N(); 
echo $html; 

しかし、それは示しています

<html> 
<body> 
<div> 
<magic></magic> 
<video controls=""></video> 
<a href="http://example.com">Example</a> 
<br></br> 
<a href="http://google.com">Google</a> 
<br></br> 
</div> 
</body> 
</html> 

私は断片化されたHTMLを保存する方法は?私は$ dom-> C14N()を思いついたが、それでもhtmlとbodyタグが追加されている。それはまた</br>を追加しますが、それは大きな問題ではありません。

この時点で、私はpreg_replaceにhtmlタグとbodyタグを削除することに頼っていますが、フラグメントとして保存する方法があればいいと思います。

+0

単純な 'save'メソッドを試しましたか? – Justinas

+0

'$ dom-> loadHTML($ html、LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);と' $ html = $ dom-> saveHTML(); 'を使用してください。 –

+0

@WiktorStribiżewそれが問題を解決しました。私の質問への答えとしてそれを受け入れることができるように答えてください。ありがとう。 – netrox

答えて

1

あなたはこのようにDOM構造を初期化する必要があります。

$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 
$html=$dom->saveHTML(); 

PHP documentation参照してください:

LIBXML_HTML_NOIMPLIEDinteger
設定暗黙のHTMLの追加を自動オフにHTML_PARSE_NOIMPLIEDフラグを、/ボディ...要素。

LIBXML_HTML_NODEFDTDinteger
セットものが見つからなかった場合に追加される既定のDOCTYPEを防止HTML_PARSE_NODEFDTDフラグ。

関連する問題