PHPの正規表現でimgタグ内のsrcの値(URL)を取得する方法

皆さん、こんにちは!
突然ですが、正規表現っていつも悩ませてくれちゃいますね。
今回はHTMLのimgタグからPHPの正規表現を使ってsrcの値、つまりURL(パス)を取得しようって話です。
なぜ悩むかと言うと、様々な書き方があり、場合によっては上手く取得できないこともあるからです。
preg_match_all()で正規表現検索
関数の使い方
ネットで探す前に、まずはマニュアルを読みましょう。
PHP: preg_match_all - Manual - php.net |
第2引数に検索文字列。
第3引数に検索結果が配列で返ってくるようです。
まとめると、
preg_match_all([パターン], [検索文字列], [検索結果(配列)], [オプション]);
オプションはよくわからないので今回は飛ばします。
一部取得に失敗した例
WordPressを使っている人なら、かなりの確率でご存知かもしれませんが、「Newpost Catch」というプラグインの中に今回のヒントが隠されていました。
Newpost Catchはアイキャッチ画像が存在しなくても、コンテンツに含まれる画像を自動的に探して一覧のサムネイルとして表示してくれます。
Thumbnails in new articles setting widget. Newpost Catch - WordPress.org |
preg_match_all()
関数が使用されているところを抜粋しました。
wp-content\plugins\newpost-catch\class.php
//thumbnail
function no_thumb_image() {
ob_start();
ob_end_clean();
preg_match_all( '/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', get_the_content(), $matches );
if( isset($matches[1][0]) && !is_wp_error($matches[1][0]) ){
$set_img = $matches[1][0];
} else {
$set_img = $this->default_thumbnail;
}
return $set_img;
}
注目すべきはココです。
preg_match_all( '/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', get_the_content(), $matches );
試してみると、imgタグの書き方によっては、srcの値を取得できない場合がありました。
'/<img.+src=[\'"]([^\'"]+)[\'"].*>/i'
この正規表現のパターン部分を変更します。
成功した正規表現のパターン例
こちらが、著者が実際に使って効果を実感しているものです。
'/< *img[^>]*src *= *["\']?([^"\']*)/i'
今のところ取得できないimgタグはありません。
まとめ
下記で取得し、$matches
をゴニョゴニョすればOK!
preg_match_all( '/< *img[^>]*src *= *["\']?([^"\']*)/i', $subject, $matches );
他にも書き方があると思いますので、知っている方はコメントください。
コメント
コメントを投稿