phpでRSSリーダーを書く

simpleXml使用。ベースクラスの静的関数でタイプ(rss1,rss2,atom)を判定し、然るべきparserを使って統一した形式のオブジェクトにする。

class RssParser{
	static function getInstance($path){
		$root = simplexml_load_file($path);
		if( $root->getName() == 'feed' ){
			$parser = new AtomParser();
			$parser->root = $root;
			return $parser;
		}

		if( $root->getName() == 'RDF' ){
			$parser = new RssParser();
			$parser->root = $root;
			return $parser;
		}
		if( $root->getName() == 'rss' ){
			$parser = new Rss2Parser();
			$parser->root = $root;
			return $parser;
		}
		
	}
	function parse($limit){
		//print_r($this->root);
		$feed = new StdClass();
		
    	$feed->title = $this->root->channel->title;
    	$feed->link = $this->root->channel->link;
    	$feed->description = $this->root->channel->description;
    	$feed->date = date_create( $this->root->channel->children('http://purl.org/dc/elements/1.1/')->date );
    	$feed->item = array();
    	foreach($this->root->item as $item){
    		$rssItem = new StdClass;
    		$rssItem->title = $item->title;
    		$rssItem->link = $item->link;
    		$rssItem->description = $item->description;
    		$rssItem->date = date_create( $item->children('http://purl.org/dc/elements/1.1/')->date );
    		$feed->item[] = $rssItem;
    		if( count($feed->item) >= $limit) break;
    	}
		return $feed;
	}
}
class Rss2Parser{
	function parse($limit){
		//print_r($this->root);
		$feed = new StdClass();
		
    	$feed->title = $this->root->channel->title;
    	$feed->link = $this->root->channel->link;
    	$feed->description = $this->root->channel->description;
    	$feed->date = date_create( $this->root->channel->pubDate );

    	$feed->item = array();
    	foreach($this->root->channel->item as $item){
    		$rssItem = new StdClass;
    		$rssItem->title = $item->title;
    		$rssItem->link = $item->link;
    		$rssItem->description = $item->description;
	    	$rssItem->date = date_create( $item->pubDate );
    		$feed->item[] = $rssItem;
    		if( count($feed->item) >= $limit) break;
    	}
		return $feed;
	}
}
class AtomParser {
	function parse($limit){
		//print_r($root);
		$feed = new StdClass();
		
    	$feed->title = $this->root->title;
    	$feed->link = $this->root->xpath('/feed/link[@rel="alterate"]');
    	$feed->description = $this->root->description;
    	$feed->item = array();
    	foreach($this->root->entry as $item){
    		$rssItem = new StdClass;
    		$rssItem->title = $item->title;
    		$rssItem->link = $item->xpath('link[@rel="alterate"]');
    		$rssItem->description = $item->summary;
    		$rssItem->date = date_create( $item->issued );
    		$feed->item[] = $rssItem;
    		if( count($feed->item) >= $limit) break;
    	}
		return $feed;
		
	}
}

呼び出し側は

$parser = RssParser::getInstance($path);
$feed = $parser->parse($limit);

あとは$feed->title,$feed->link,$feed->item[0]->title,などを旨く使って表示すればOK.
limitつけてあるのは「全部はいらない、せいぜい5件ぐらいだ」みたいな使い方をするため。
表示するときはhtmlspe(ryするのを忘れないように。