勉強したことのメモ

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

  関連記事

PHPのセッションでログイン、ログアウトの管理。あとセッションが保存されない場合の対処。

セッションはほとんど使ったことがなく、 色々つまづいたのでメモ。 やりたかった事 ...

ブラウザ上でファイルのアップ・ダウンロードが可能なTiny File Managerの利用方法

ブラウザ上でファイルのアップ・ダウンロードが可能なファイルマネージャーを設置した ...

PHPとajaxでチャットの作成

■ソース ・index.php <? error_reporting(E_ ...

PHPで画像のサイズや拡張子等、詳細情報を取得

PHPで画像のサイズや拡張子等、詳細情報を取得する際 いつもググってしまっていた ...

PHP8系で「Warning: Constant xxxxx already defined in」エラーの対応方法

PHP8系&WordPress6.4.3で「Warning: Const ...