組み込み関数使えば一発でした。
とあるサイトのRSSデータを定期的に利用したくなったので調べてみました。
PHP5からsimplexml_load_file()という関数が実装さてたらしく、リファレンスによると、
XMLファイルをパースし、オブジェクトに代入する
とのこと。
XML形式のファイルならオブジェクトに格納してくれるってことですね。
さっそく実験。
<?php $url = "http://blog.paz-para.com/?feed=rss2"; $rss = simplexml_load_file($url); var_dump($rss); ?>
これを実行してみると、
object(SimpleXMLElement)#1 (2) {
["@attributes"]=>
array(1) {
["version"]=>
string(3) "2.0"
}
["channel"]=>
object(SimpleXMLElement)#2 (7) {
["title"]=>
string(17) "blog.paz-para.com"
["link"]=>
string(24) "http://blog.paz-para.com"
["description"]=>
string(61) "while($i<100)echo(++$i%15?($i%5?($i%3?$i:Paz):Para):PazPara);"
["lastBuildDate"]=>
string(31) "Mon, 19 Jul 2010 08:06:19 +0000"
["generator"]=>
string(29) "http://wordpress.org/?v=2.9.1"
["language"]=>
string(2) "ja"
["item"]=>
array(10) {
[0]=>
object(SimpleXMLElement)#3 (7) {
["title"]=>
string(27) "UnixBenchインストール"
["link"]=>
string(32) "http://blog.paz-para.com/?p=2417"
["comments"]=>
string(41) "http://blog.paz-para.com/?p=2417#comments"
["pubDate"]=>
string(31) "Mon, 19 Jul 2010 08:06:19 +0000"
["category"]=>
object(SimpleXMLElement)#13 (0) {
}
["guid"]=>
string(32) "http://blog.paz-para.com/?p=2417"
["description"]=>
object(SimpleXMLElement)#14 (0) {
}
}
[1]=>
object(SimpleXMLElement)#4 (7) {
・
・
・
こんな感じで、「channel」内にサイトデータが、「item」内に各エントリデータが格納されています。
なので、
<?php
$url = "http://blog.paz-para.com/?feed=rss2";
$rss = simplexml_load_file($url);
echo $rss->channel->title . "\n";
echo '<hr>' . "\n";
echo '<dl>' . "\n";
foreach ($rss->channel->item as $item) {
echo '<dt><a href="' . htmlspecialchars($item->link) . '">' . htmlspecialchars($item->title) . '</a></dt>' . "\n";
echo '<dd>' . htmlspecialchars($item->description) . '</dd>' . "\n";
}
echo '</dl>' . "\n";
?>
このように、foreachでループさせれば、各要素にアクセスできるわけです。
日本語(マルチバイト文字列)を扱う場合、環境によっては文字化けすることもありますので、mb_convert_encoding()関数などを使って適宜エンコードする必要がありそうです。
また、今回はサンプルのためhtmlspecialchars()関数のみ利用してますが、セキュリティ対策もしっかりやらないといけませんね。
とりあえず、外部RSSの取得は成功。
次はデータの整形と保存方法を考えます。