PHPでRSS FEEDを解析
dev March 28th, 2007fff外部ブログサイトのRSS FEEDをPHPで解析してサイトに表示、リンクさせる方法。サンプル探してみたらこんなのがありました。
MagpieRSSは、GPLで開発されているRSSを解析するライブラリ、いわゆるRSSパーサです。PHPでリモートからRSSを取得して解析、キャッシュを行います。
- 言われるままにダウンロード(こちらから→SourceForge.net: Files)して解凍
- 解凍したフォルダにsample.phpとして下記の内容でファイルを作成
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <title>sample</title> </head> <body> <?php require_once('./rss_fetch.inc'); define('MAGPIE_OUTPUT_ENCODING', 'UTF-8'); $url = 'http://yourdomain.com/rssfile.rdf'; $rss = fetch_rss($url); $title = $rss->channel['title']; echo "<h1>$title</h1>n"; echo "<ul>n"; foreach ($rss->items as $item ) { $title = $item['title']; $link = $item['link']; $pubdate = $item['dc']['date']; echo "<li><a xhref=\"$link\">$title ($pubdate)</a></li>n"; } echo "</ul>n"; ?> </body> </html> - ブラウザで確認したら、日付がうまくとれてないみたい(今回読み込むFEEDはFC2ブログのもの)。rss_util.incをちょっと改造(28行目)すると日付も表示できた(sample1 - てんぽさんのFEED読ませてもらってます)。
- 変更前
-
$pat = "/(d{4})-(d{2})-(d{2})T(d{2}):(d{2})(:(d{2}))?(?:([-+])(d{2}):?(d{2})|(Z))?/"; - 変更後
-
$pat = "/(d{4})-(d{2})-(d{2})T(d{2}):(d{2}):(d{2})+(d{2}):(Z)/";
この改造は何かを失ってる気がする。そして、紆余曲折あってinit.incで
- FEEDのURL
- HTMLのフォーマット(dl or ul)
- 表示件数
- リンクのタイプ(外部リンクやら~)
- 日付のフォーマット
- ブログタイトルをどのタグで囲うか
を設定できるように改造。
- $url
- (FEEDのURLを指定)
- $soe
- (表示したいエントリーの数を指定)
- $dateformat
-
- typeA
- 2007.03.23
- typeB
- 2007.03.23-12:02
- $htmlformat
- "dl" or "ul"
- $linkformat
-
- normal
-
<a xhref="link" mce_href="link" title="title"> - wo
-
<a xhref="link" mce_href="link" title="title" onclick="window.open(this.href,''); return false;"> - external
-
<a xhref="link" mce_href="link" title="title" rel="external">
- $tmark
- "h1" or "h2" or ... "p" or ...
htmlformatter.incとdateformatter.incを同じ階層に置いてこのような使い方。
- sample2.php
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <title>sample</title> </head> <body> <?php require_once('./init.inc'); require_once('./rss_fetch.inc'); require_once('./dateformatter.inc'); require_once('./htmlformatter.inc'); define('MAGPIE_OUTPUT_ENCODING', 'UTF-8'); $rss = fetch_rss($url); $title = $rss->channel['title']; $siteurl = $rss->channel['link']; $sitename = formattitle($title,$siteurl,$tmark,$linkformat); $entrylist = formathtml($htmlformat,$linkformat,$dateformat,$rss,$soe); echo ("<div id=\"entrylist\">".$entrylist.$sitename."</div>"); ?> </body> </html> - init.inc
-
<?php $url = "http://mb.blog7.fc2.com/?xml"; $soe = 3; $dateformat = "typeA"; $htmlformat = "ul"; $linkformat = "wo"; $tmark = "p"; ?>
なんとなくイモくさいコードだけどまーいいか。
