リンクをカードにするプラグインを作ろう!(6)文字コードを変換する

PHP
この記事は約3分で読めます。

上手くタイトルと概要文が取れないサイトの対応をします。

前回まで

OGPが設定されていないサイトのタイトルと概要文を取得しました。

UTF-8以外の文字コードのサイト

文字コードがUTF-8以外の場合、正しく文字を扱うことが出来ず、タイトルや概要文が取得できません。

UTF-8に文字コードを変換すると上手く扱うことが出来ます。

文字コードがEUC-JPのサイト

4Gamer.net ― 日本最大級の総合ゲーム情報サイト。最新ゲームのニュース,レビューはここで!
ゲームの最新ニュースをお届けします。また,ゲームのタイトルのユーザーレビューの募集/掲載や,発売スケジュールなども用意。遊びたいゲームを探す時にご活用ください!
←サイト名称
←タイトル
https://www.4gamer.net/ ←URL
←概要文

文字コードがシフトJISのサイト

NTTグループの安心オンラインストア - NTT-X Store
NTTグループが運営する安心・安全の通販ショップNTT-X Store。パソコン、液晶ディスプレイ、デジカメ、デジタル機器、ネットワークカメラ、家電、DVDなどを激安価格と即納で通信販売!送料無料やクーポンなどお得な商品を多数掲載中です。
←サイト名称
←タイトル
https://nttxstore.jp/ ←URL
←概要文

コードを書いていく

文字コードを変換する

cURLで取得した$htmlの文字コードをUTF-8に変換します。

            if (curl_errno($ch ) ) {
                $site_name = '';
                $title = $url;
                $excerpt = '';
            } else {
                $html = mb_convert_encoding($html, 'UTF-8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS' );
                if (preg_match('/property="og:title"\s*content="([^"]*)/si', $html, $m ) ) {
                    $title = esc_html($m[1]);
                } else {
                    if (preg_match('/<\s*title\s*[^>]*>\s*([^<]*)\s*<\s*\/title\s*[^>]*>/si', $html, $m ) ) {
                        $title = esc_html($m[1]);
                    }
                }

タイトルと概要文が取得できた

もう一度試してみます。

文字コードがEUC-JPのサイト

4Gamer.net ― 日本最大級の総合ゲーム情報サイト。最新ゲームのニュース,レビューはここで!
ゲームの最新ニュースをお届けします。また,ゲームのタイトルのユーザーレビューの募集/掲載や,発売スケジュールなども用意。遊びたいゲームを探す時にご活用ください!
www.4gamer.net ←サイト名称
4Gamer.net ― 日本最大級の総合ゲーム情報サイト。最新ゲームのニュース,レビューはここで! ←タイトル
https://www.4gamer.net/ ←URL
ゲームの最新ニュースをお届けします。また,ゲームのタイトルのユーザーレビューの募集/掲載や,発売スケジュールなども用意。遊びたいゲームを探す時にご活用ください! ←概要文

文字コードがシフトJISのサイト

NTTグループの安心オンラインストア - NTT-X Store
NTTグループが運営する安心・安全の通販ショップNTT-X Store。パソコン、液晶ディスプレイ、デジカメ、デジタル機器、ネットワークカメラ、家電、DVDなどを激安価格と即納で通信販売!送料無料やクーポンなどお得な商品を多数掲載中です。
nttxstore.jp ←サイト名称
NTTグループの安心オンラインストア – NTT-X Store ←タイトル
https://nttxstore.jp/ ←URL
NTTグループが運営する安心・安全の通販ショップNTT-X Store。パソコン、液晶ディスプレイ、デジカメ、デジタル機器、ネットワークカメラ、家電などを激安価格と即納で通信販売!送料無料やクーポンなどお得な商品を多数掲載中です。 ←概要文

今回のコード

今回はここまでです。

]*>\s*([^<]*)\s*<\s*\/title\s*[^>]*>/si', $html, $m ) ) {
                    $title = esc_html($m[1]);
                }
            }
            if (preg_match('/property="og:description"\s*content="([^"]*)/si', $html, $m ) ) {
                $excerpt = esc_html($m[1]);
            } else {
                if (preg_match('/name="description"\s*content="([^"]*)/si', $html, $m ) ) {
                    $excerpt = esc_html($m[1]);
                }
            }
            if (preg_match('/property="og:site_name"\s*content="([^"]*)/si', $html, $m ) ) {
                $site_name = esc_html($m[1]);
            } else {
                $m = parse_url($url );
                $site_name = $m['host'];
            }
        }
        curl_close($ch );
        $html = '
'.$site_name.'
'.$title.'
'.$url.'
'.$excerpt.'
'; return $html; } } $popo_blogcard = new popo_blogcard;

次回は・・・

スタイルシートを設定してブログカードっぽい見た目にしようと思います。

では、この辺で。(^-^)o

コメント

  1. ぽぽろん様

    始めまして。Pz-LinkCardを大変便利に利用させて頂いております。

    抜粋文(概要文)について教えて頂きたいのですが
    Metaタグのdescription(og:description)の内容を表示させることは可能でしょうか。

    お手数ですがご教示頂けると幸いです。
    よろしくお願いいたします。

    • 谷内さん、ご利用&コメントありがとうございます。

      Pz-LinkCardでは、外部リンクの場合、「og:description」、「meta description」の順番で取得して表示しています。

      内部リンクの場合、記事内容から取得していますが、記事取得方法を「抜粋文が設定されている投稿はそちらを優先する」にすると、descriptionと同じ文が取得できると思います。

      どちらかのサイトで上手く取得できていない状況でしょうか?

タイトルとURLをコピーしました