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