如何使用PHP获取网站的rss feed url?

时间:2011-08-06 16:21:00

标签: php rss

我需要以编程方式查找网站的RSS订阅源。

[使用php或jquery]

4 个答案:

答案 0 :(得分:13)

已经回答了一般流程(QuentinDOOManiac),因此有些代码(Demo):

<?php

$location = 'http://hakre.wordpress.com/';
$html = file_get_contents($location);
echo getRSSLocation($html, $location); # http://hakre.wordpress.com/feed/

/**
 * @link http://keithdevens.com/weblog/archive/2002/Jun/03/RSSAuto-DiscoveryPHP
 */
function getRSSLocation($html, $location){
    if(!$html or !$location){
        return false;
    }else{
        #search through the HTML, save all <link> tags
        # and store each link's attributes in an associative array
        preg_match_all('/<link\s+(.*?)\s*\/?>/si', $html, $matches);
        $links = $matches[1];
        $final_links = array();
        $link_count = count($links);
        for($n=0; $n<$link_count; $n++){
            $attributes = preg_split('/\s+/s', $links[$n]);
            foreach($attributes as $attribute){
                $att = preg_split('/\s*=\s*/s', $attribute, 2);
                if(isset($att[1])){
                    $att[1] = preg_replace('/([\'"]?)(.*)\1/', '$2', $att[1]);
                    $final_link[strtolower($att[0])] = $att[1];
                }
            }
            $final_links[$n] = $final_link;
        }
        #now figure out which one points to the RSS file
        for($n=0; $n<$link_count; $n++){
            if(strtolower($final_links[$n]['rel']) == 'alternate'){
                if(strtolower($final_links[$n]['type']) == 'application/rss+xml'){
                    $href = $final_links[$n]['href'];
                }
                if(!$href and strtolower($final_links[$n]['type']) == 'text/xml'){
                    #kludge to make the first version of this still work
                    $href = $final_links[$n]['href'];
                }
                if($href){
                    if(strstr($href, "http://") !== false){ #if it's absolute
                        $full_url = $href;
                    }else{ #otherwise, 'absolutize' it
                        $url_parts = parse_url($location);
                        #only made it work for http:// links. Any problem with this?
                        $full_url = "http://$url_parts[host]";
                        if(isset($url_parts['port'])){
                            $full_url .= ":$url_parts[port]";
                        }
                        if($href{0} != '/'){ #it's a relative link on the domain
                            $full_url .= dirname($url_parts['path']);
                            if(substr($full_url, -1) != '/'){
                                #if the last character isn't a '/', add it
                                $full_url .= '/';
                            }
                        }
                        $full_url .= $href;
                    }
                    return $full_url;
                }
            }
        }
        return false;
    }
}

请参阅:RSS auto-discovery with PHP (archived copy)

答案 1 :(得分:3)

这比在这里粘贴一些代码要多得多。但我可以指出你正确的方向,你需要做什么。

  1. 首先,您需要获取页面
  2. 解析你找回的字符串,寻找RSS Autodiscovery Meta tag。您可以将整个文档映射为XML并使用DOM遍历,但我只使用正则表达式。
  3. 提取标记的href部分,您现在拥有RSS源的URL。

答案 2 :(得分:1)

rules for making RSS discoverable有很好的记录。您只需要解析HTML并查找描述的元素。

答案 3 :(得分:1)

稍微小一点的功能,可以获取第一个可用的Feed,无论是rss还是atom(大多数博客都有两个选项 - 这会抓住第一个首选项。)

public function getFeedUrl($url){
        if(@file_get_contents($url)){
            preg_match_all('/<link\srel\=\"alternate\"\stype\=\"application\/(?:rss|atom)\+xml\"\stitle\=\".*href\=\"(.*)\"\s\/\>/', file_get_contents($url), $matches);
            return $matches[1][0];
        }
        return false;
    }