勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

PHPでサイトURLからtitleとRSS用URLを取得

   2024/04/17  PHP

サイトのURLからRSS用URLとサイトタイトルを自動で取得したかった。その方法のメモ。

 

ソースコード

<?php
function findFeedUrl( $url ){
    if ( !$url ) return false;

    $html = file_get_contents($url);

    if( !$html ) return false;

    $title = (preg_match('/<title>(.*?)<\/title>/i', mb_convert_encoding($html, 'UTF-8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS'), $result)) ? $result[1] : '';

    preg_match_all('/<link\s+(.*?)\s*\/?>/is', $html, $matches);
    $links = $matches[1];
    $finalLinks = array();
    foreach ($links as $idx=>$link) {
        $attributes = preg_split('/\s+/s', $link);
        foreach ($attributes as $attribute) {
            $att = preg_split('/\s*=\s*/s', $attribute, 2);
            if(isset($att[1])) {
                $att[1] = preg_replace('/([\'"]?)(.*)\1/', '$2', $att[1]);
                $finalLink[strtolower($att[0])] = $att[1];
            }
        }
        $finalLinks[$idx] = $finalLink;
    }

    $href = null;
    foreach ($finalLinks as $finalLink) {
        if (!array_key_exists('type', $finalLink)) {
            continue;
        }
        switch (strtolower($finalLink['type'])) {
        case 'application/x.atom+xml':
        case 'application/atom+xml':
        case 'application/xml':
        case 'text/xml':
        case 'application/rss+xml':
        case 'application/rdf+xml':
            if (array_key_exists('href', $finalLink)) {
                $href = $finalLink['href'];
            }
            break;
        default:
            break;
        }

        if ($href) {
            if (strstr($href, 'http://') !== false) {
                $fullUrl = $href;
            } else {
                $urlParts = parse_url($url);
                $fullUrl = "http://{$urlParts['host']}";
                if (isset($urlParts['port'])) {
                    $fullUrl .= ":{$urlParts['port']}";
                }
                if ($href{0} != '/'){
                    if (isset($urlParts['path'])) {
                        $fullUrl .= dirname($urlParts['path']);
                    }
                    if (substr($fullUrl, -1) != '/') {
                        $fullUrl .= '/';
                    }
                }
                $fullUrl .= $href;
            }
            return array($fullUrl, $title);
        }
    }

    return false;
}

var_dump(findFeedUrl('https://taitan916.info/blog/')); //array(2) { [0]=> string(37) "https://taitan916.info/blog/?feed=rss2" [1]=> string(30) "勉強したことのメモ。" }

 - PHP

  関連記事

DTIのVPSにCodeigniter3を導入する方法

DTIのVPSにPHPフレームワークのCodeigniter3系をインストールし ...

Mailtrap & PHPMailerでメールサーバ無しの環境でもメール送信テストを行う方法

開発環境等メールサーバが無い環境でメール送信テストを行う際にMailtrapとい ...

PHPでアクセスIPからランダム英数字のIDを作成

PHPで掲示板などにあるようなアクセスIPからランダム英数字のIDを作成したかっ ...

CodeIgniter4で簡易版ログインシステムの実装方法(管理画面向け)

CodeIgniter4で管理画面向けの簡易版ログインシステムを作成したい。通常 ...

PhpSpreadsheetで作成したエクセルファイルをPDFファイルに変換する方法

以前にPhpSpreadsheetでフォーマット用のエクセルを読み込み、指定した ...