web-dev-qa-db-ja.com

PHPで文字列の最初の画像を取得する

各投稿から最初の画像を取得しようとしています。以下のコードは、画像が1つしかない場合に最適です。しかし、私が複数持っている場合、それは私にイメージを与えますが、常に最初のものではありません。

私は本当に最初の画像だけが欲しいです。多くの場合、2番目の画像は次のボタンです

$texthtml = 'Who is Sara Bareilles on Sing Off<br>
<img alt="Sara" title="Sara" src="475993565.jpg"/><br>
<img alt="Sara" title="Sara two" src="475993434343434.jpg"/><br>';

preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $texthtml, $matches);
$first_img = $matches [1] [0];

これで、この「$ first_img」を取得して、短い説明の前に貼り付けることができます

<img alt="Sara" title="Sara" src="<?php echo $first_img;?>"/>
26
MHowey

最初のソースタグのみが必要な場合は、preg_matchの代わりにpreg_match_all、これでうまくいきますか?

<?php
    $texthtml = 'Who is Sara Bareilles on Sing Off<br>
    <img alt="Sara" title="Sara" src="475993565.jpg"/><br>
    <img alt="Sara" title="Sara two" src="475993434343434.jpg"/><br>';
    preg_match('/<img.+src=[\'"](?P<src>.+?)[\'"].*>/i', $texthtml, $image);
    echo $image['src'];
?>
43
derp

正規表現を使用してHTMLを解析しないでください。 phpqueryとして、html解析のlib/classを使用します。

require 'phpQuery-onefile.php';

$texthtml = 'Who is Sara Bareilles on Sing Off<br> 
<img alt="Sarahehe" title="Saraxd" src="475993565.jpg"/><br> 
<img alt="Sara" title="Sara two" src="475993434343434.jpg"/><br>'; 
$pq = phpQuery::newDocumentHTML($texthtml);
$img = $pq->find('img:first');
$src = $img->attr('src');
echo "<img alt='foo' title='baa' src='{$src}'>";

ダウンロード: http://code.google.com/p/phpquery/

5
The Mask

ここからの回答をテストした後 正規表現を使用してHTMLコードから最初の画像ソースを抽出しますか? 壊れたリンク画像が少ない方が、ここに提供されている回答よりも良い結果が得られました。

正規表現はさまざまなタスクに適していますが、通常、HTML DOMを解析する場合は不十分です。 HTMLの問題は、ドキュメントの構造が非常に変動するため、正確に(正確には、誤検知のない100%の成功率を意味する)タグを抽出することが難しいことです。

より一貫した結果を得るには、このオブジェクトを使用します http://simplehtmldom.sourceforge.net/ これにより、htmlを操作できます。私が投稿した最初のリンクの応答に例が示されています。

function get_first_image($html){
require_once('SimpleHTML.class.php')

$post_html = str_get_html($html);

$first_img = $post_html->find('img', 0);

if($first_img !== null) {
    return $first_img->src';
}

return null;
}

楽しい

正規表現は常に最初のものと一致していますか?呼び出すたびに配列を出力してみてください。

error_log(var_export($matches, true));

1
Sky Kelsey