2011-01-26 11 views
9

私はドキュメントを解析し、すべてのイメージタグを取得して、何か別のものをソースに変更しようとしています。php DomDocumentは余分なタグを追加します

 

    $domDocument = new DOMDocument(); 

    $domDocument->loadHTML($text); 

    $imageNodeList = $domDocument->getElementsByTagName('img'); 

    foreach ($imageNodeList as $Image) { 
     $Image->setAttribute('src', 'lalala'); 
     $domDocument->saveHTML($Image); 
    } 

    $text = $domDocument->saveHTML(); 
 

$テキストは最初に次のようになります。


<p>Hi, this is a test, here is an image<img src="http://mysite.com/beer.jpg" width="60" height="95" /> Because I like Beer!</p>

と、これは出力$テキストです:私は(HTML、体内の余分なタグの束を取得してい


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>Hi, this is a test, here is an image<img src="lalala" width="68" height="95"> Because I like Beer!</p></body></html>

、そして上のコメント)私が本当に必要としない。これらの余分なタグを追加しないようにDOMDocumentをセットアップする方法はありますか?

ありがとうございました!

答えて

5

DomDocumentは残念ながら遅れており、これをやらせません。

のDOMDocumentあなたがロードしているHTMLコードが含まれており、タグれていない場合、それはそこに、うん(自動的に追加非常に悪い設計された「機能」を持っている:あなたはhttp://beerpla.net/projects/smartdomdocument-a-smarter-php-domdocument-class/を使用することができます

$text = preg_replace('/^<!DOCTYPE.+?>/', '', str_replace(array('<html>', '</html>', '<body>', '</body>'), array('', '', '', ''), $domDocument->saveHTML())); 
+1

これは次のようになります:$ text = preg_replace( '/^/'、 ''、str_replace(array( ''、 ''、 ''、 '' '、' ')、$ domDocument-> saveHTML())); –

+0

'preg_replace'、本当ですか? – sglessard

-1

HTMLとして保存する場合は、有効なHTML文書を作成する必要があります。

別のオプションがあります:DOMDocument::saveXMLは、あなたが特定の要素のXMLコンテンツにアクセスすることを可能にするオプションのパラメータがあります。

$el = $domDocument->getElementsByTagName('p')->item(0); 
$text = $domDocument->saveXML($el); 

これはあなたのコンテンツは一つだけpの要素を持っていることを前提としています。

+0

$text = '<p>Hi, this is a test, here is an image<img src="http://example.com/beer.jpg" width="60" height="95" /> Because I like Beer!</p>'; $domDocument = new DOMDocument; $domDocument->loadHTML($text, LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD); $imageNodeList = $domDocument->getElementsByTagName('img'); foreach ($imageNodeList as $Image) { $Image->setAttribute('src', 'lalala'); $domDocument->saveHTML($Image); } $text = $domDocument->saveHTML(); echo $text; 

出力:

$domDocument->loadHTML($text, LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD); 

IDEONE demoを参照してください。 。作成されたXMLは、コンテンツなしでHTML文書を破損する要素(例えば、

10

メソッドにフラグを2つ追加するだけです:LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD。私。それはHTMLソースを取得するためにsaveXML()を使用することが常に良い考えではありません文書内の使用要素に依存

<p>Hi, this is a test, here is an image<img src="lalala" width="60" height="95"> Because I like Beer!</p> 
+2

これはうまくいくはずです。ありがとう。 – Lynnais

+0

私のためには、そこからすべてのhtmlを取り除くだけです。私の段落もなくなっています。 – Mike

+0

@Mike:コードは何も削除しないので不可能です。おそらくあなたが持っているHTMLが完全に有効ではないかもしれません。 '$ domDocument = new DOMDocument;'でDOMDocumentを初期化する前に 'libxml_use_internal_errors(true);'を追加してみてください。 –

関連する問題