読者です 読者をやめる 読者になる 読者になる

ウェブサービスを作っています。

フィードの URL を取得する

PHP

PEAR に関数ないのかなぁ...と思っていたのですが、なさそうでした。
Perl にはあるみたいです。(参考)


しょうがないから自分で書こうかと思っていたら、見つけました。
Page not found · GitHub Pages
以下、再掲じゃないけど、ほぼ変えていません。適当です。

<?php
/**
 * HTMLからRSSフィードURLを取得して返す
 *
 * @param string $url 取得HTMLのURL
 * @return string RSSフィードURL
 */
function findFeedUrl($url)
{
    if (!$url) {
        return false;
    }

    $html = file_get_contents($url);
    if(!$html){
        return false;
    }

    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 $fullUrl;
        }
    }

    return false;
}


これで、http://blog.gotomaki.net/ から http://blog.gotomaki.net/index.rdf を引っ張ってくることができます。