HTMLを取り、imgタグを取り除いてhtml(sansイメージ)を返す関数を書く必要があります。しかし、imgs(配列内)を保持して、ページに別々に出力できるようにする必要もあります。htmlのPHPストリップのimgタグ、htmlと配列の画像を返す
私はほとんどすべてのPHPを知っているので、これを行うための最善の方法は何ですか?
HTMLを取り、imgタグを取り除いてhtml(sansイメージ)を返す関数を書く必要があります。しかし、imgs(配列内)を保持して、ページに別々に出力できるようにする必要もあります。htmlのPHPストリップのimgタグ、htmlと配列の画像を返す
私はほとんどすべてのPHPを知っているので、これを行うための最善の方法は何ですか?
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);
}
<?php
$pattern = '/<img[^>]*src="([^"]*)[^>]*>/i';
preg_match_all($pattern, $data, $matches);
// image src array
$images = $matches[1];
// no images
$html = preg_replace($pattern, '', $data);
?>
すべての画像は、ルート文書の直接の子であるならば受け入れ答えにのみ機能します。ネストされたドキュメントの場合は、this answerを使用する方がよいでしょう。
これはかなり興味深いものですが、私は将来の読書のためにそれをブックマークしました。私が働いているHTMLは関数によって返されますが、それがうまくいくかどうかは分かりません。 – hamishtaplin
@dr_tchock 'DOMDocument :: loadHTML()'は、ファイルではなく文字列からHTMLを読み込みます。関数が文字列を返す場合は、あなたのために動作します。 http://www.php.net/manual/en/domdocument.loadhtml.php –
ループ内でその配列を反復処理している間は、配列から項目を削除しないでください。 – lovesh