2011-03-11 12 views
3

HTMLを取り、imgタグを取り除いてhtml(sansイメージ)を返す関数を書く必要があります。しかし、imgs(配列内)を保持して、ページに別々に出力できるようにする必要もあります。htmlのPHPストリップのimgタグ、htmlと配列の画像を返す

私はほとんどすべてのPHPを知っているので、これを行うための最善の方法は何ですか?

答えて

6

DOMDocument classに慣れておく必要があります。これを行う最善の方法は、DOMDocumentを使用してHTMLを解析し、getElementsByTagName('img')を使用してすべての<img>タグを探します。画像のsrc属性の場合、DOMDocumentはそれらを返して配列に格納できます。

// HTML already parsed into $dom 
$imgs = $dom->getElementsByTagName('img'); 
$img_src = array(); 

// Array of nodes to remove. 
$to_remove = array(); 

foreach ($imgs as $img) { 
    // Store the img src 
    $img_src[] = $img->getAttribute('src'); 

    // Delete the node (I think this works) 
    $to_remove[] = $img; 
} 

// Then remove all the nodes slated for deletion: 
foreach ($to_remove as $node) { 
    $dom->removeChild($img); 
} 
+0

これはかなり興味深いものですが、私は将来の読書のためにそれをブックマークしました。私が働いているHTMLは関数によって返されますが、それがうまくいくかどうかは分かりません。 – hamishtaplin

+0

@dr_tchock 'DOMDocument :: loadHTML()'は、ファイルではなく文字列からHTMLを読み込みます。関数が文字列を返す場合は、あなたのために動作します。 http://www.php.net/manual/en/domdocument.loadhtml.php –

+0

ループ内でその配列を反復処理している間は、配列から項目を削除しないでください。 – lovesh

0
<?php 
$pattern = '/<img[^>]*src="([^"]*)[^>]*>/i'; 
preg_match_all($pattern, $data, $matches); 

// image src array 
$images = $matches[1]; 

// no images 
$html = preg_replace($pattern, '', $data); 
?> 
1

すべての画像は、ルート文書の直接の子であるならば受け入れ答えにのみ機能します。ネストされたドキュメントの場合は、this answerを使用する方がよいでしょう。