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するのを忘れないように。