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

php-preg_match_all

皆さん、こんにちは!
突然ですが、正規表現っていつも悩ませてくれちゃいますね。
今回はHTMLimgタグからPHP正規表現を使ってsrcの値、つまりURL(パス)を取得しようって話です。
なぜ悩むかと言うと、様々な書き方があり、場合によっては上手く取得できないこともあるからです。

preg_match_all()で正規表現検索

関数の使い方

ネットで探す前に、まずはマニュアルを読みましょう。

  • 第1引数に正規表現の検索パターンを。
  • 第2引数検索文字列
  • 第3引数検索結果配列で返ってくるようです。

まとめると、

preg_match_all([パターン], [検索文字列], [検索結果(配列)], [オプション]);

オプションはよくわからないので今回は飛ばします。

一部取得に失敗した例

WordPressを使っている人なら、かなりの確率でご存知かもしれませんが、「Newpost Catch」というプラグインの中に今回のヒントが隠されていました。
Newpost Catchアイキャッチ画像が存在しなくても、コンテンツに含まれる画像自動的に探して一覧のサムネイルとして表示してくれます。

この中で、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 );

他にも書き方があると思いますので、知っている方はコメントください。


Amazonベストセラー

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA