doudonn WEB制作やサーバーの話とかいろいろ

【PHP】OGP画像の取得方法3選()の話

doudonn 更新日:
【PHP】OGP画像の取得方法3選()の話

OGP画像の取得方法

やり方はいろいろありますが、やはり速いのが一番。
自分がやっている方法と、その他いろいろ紹介したい。

file_get_contentsなどでHTMLを取得するのは共通なので省略。

1、置換で取得

$subject = array('','',''); 
$pattern = array('#\r\n|\n|\r#','#^.+?og:image["\'].*?content=["\']#','#["\'].+?$#'); 
$ogpimg = preg_replace($pattern, $subject, $html);

次の流れです。

・改行コードを全て削除
・先頭から「og:image” content=”」までを削除
・「”」から最後までを削除

これでOGPのURLだけが残ります。
「og:image”」の後の空白が複数あったりするサイトもあったので、
それに対応するべくこうなりました。
多分、これが一番成功率が高いのではと思います。

とりあえず、これで困ったことは無い。

2、正規表現マッチで取得

preg_match('#og:image["\'].*?content=["\'](.*?)["\']#', $html, $result);
$ogpimg = $result[1];

次の流れです。

・「og:image” content=”xxxxxxxx”」をマッチ
・「content」の中身を取得

このやり方が最もスマートだと思います。
人に見せるコードならこちらだろう。

3、DOMで取得

「ogp 画像取得 PHP」でググってください()

※こんな重たい処理をやるのは馬鹿馬鹿しいので非推奨。

置換とマッチはどっちが速いか?

置換 マッチ
0.000185966 0.00007010
0.000188112 0.00000310
0.000188828 0.00000310

うん、マッチですね…

OGPを全部取得したい場合

<?php
$match = preg_match_all( '#<meta property=["\']og:([^"\']+)["\'] content=["\']([^"\']+)["\'].*?>#', $html, $result );

if($match > 0){

$count = count($result[1]);

for( $i = 0; $i < $count; $i++ ) {
$opg[$result[1][$i]] = $result[2][$i];
}

}

$title = $opg['title'];
$url = $opg['url'];
$site_name = $opg['site_name'];
$image = $opg['image'];
$description = $opg['description'];
?>

「og:」の項目を全て取得します。
外部リンク用のカードを作るなら全部取得したい。

まとめ

何にせよ「file_get_contents」や「cURL」でHTMLを取得してから加工。

どうしてもその「丸ごと読み込む」という処理が入るので重くなります。
RSSで取得して、サムネもついでに!となると負荷がとんでもない。
サイトによっては使う画像もメチャクチャなので注意。

また、ogp画像はサイズが大きいことが多いです。
ダウンロードして使う場合はサイズダウンや圧縮が必須。
そこがまた面倒くさいところです。

よくあるエラー

・URLがメッチャ長い
→「VARCHAR(255)」では足りません。

・普通じゃない拡張子
→画像加工する場合は対処必須

・パラーメーターがついている
→末尾の「jpg」で判断しないように

そんなところで、取得してからが勝負なところです。
結局、1個1個取得して加工することになるので「file_get_contents」でゆっくりやっていい。

レンサバ会社から怒られないよう気を付けよう。

--

PHP全般の関連記事

記事一覧はこちら:PHP全般

管理人について
doudonn
名前:doudonn(どうどん)
ひたすらWEB制作な人。
一応社長です。音ゲー好き

<Twitterはこちら>
ゲーム垢
WEB制作垢
お知らせ

2022年11月30日に全記事削除しました。
まだ再開に向け作りかけ。


無駄にページ表示速度にこだわってます。

役立ちサイト
wiki
© 2022-2023 doudonn All Rights Reserved.