修正しました。
<?php //ブログなどのRSS FEEDのURL設定 $rssdata = simplexml_load_file("http://blogs.yomiuri.co.jp/olympic2012/atom.xml"); // 読み込み件数を設定 $num_of_data = 3; //出力内容を空っぽに初期化 $outdata = ""; if ($rssdata->getName() == 'feed') { // atom の場合の処理 $children = $rssdata->children('http://www.w3.org/2005/Atom'); //設定した読み込み件数分だけ取得を繰り返す for ($i=0; $i<$num_of_data; $i++){ $myEntry = $children->entry[$i]; //記事1個取得 $myDate = $myEntry->published; //日付取得 $myTitle = $myEntry->title; //タイトル取得 //リンクURL取得 $myAttr = $myEntry->{'link'}->attributes(); $myLink = $myAttr['href']; if(preg_match('/柔道/', $myTitle)) { //出力内容にタイトル(リンク付)を入れる $outdata .= '<h3 class="posttitle"><a href="' . $myLink . '">' . $myTitle . '</a></h3>' . "\n"; //出力内容に日付けを入れる $outdata .= '<p class="postdate">' . $myDate . '</p>' . "\n"; } } } else { // rss の場合の処理 //設定した読み込み件数分だけ取得を繰り返す for ($i=0; $i<$num_of_data; $i++){ $myEntry = $rssdata->channel->item[$i]; //記事1個取得 $myDate = $myEntry->pubDate; //日付取得 $myTitle = $myEntry->title; //タイトル取得 $myLink = $myEntry->link; //リンクURL取得 if(preg_match('/柔道/', $myTitle)) { //出力内容にタイトル(リンク付)を入れる $outdata .= '<h3 class="posttitle"><a href="' . $myLink . '">' . $myTitle . '</a></h3>' . "\n"; //出力内容に日付けを入れる $outdata .= '<p class="postdate">' . $myDate . '</p>' . "\n"; } } } echo $outdata; //全部出力する ?>
正規表現で、とのことなので preg_match を使いましたが、単純な文字列検索なだけなら以下のようにしてやった方が良いかもしれません。
if(strpos($myTitle, '柔道') !== false) { //略 }
▽2
●
うぃんど ●300ポイント ベストアンサー |
大きな変更箇所としては、先頭から3件読み込んでいたところを、
対象itemが最大設定の3件に到達するまで読み込むという形にするために、
ループの方法を変えています。
http://q.hatena.ne.jp/1343477263 のコメント欄で話題になったrdfにも対応しておきました。
rdfの例として、はてブのrssのURLをサンプルコード中に書いておきました。
共通部分をサブルーチン化するなどすれば、もっとスマートになりますが、
変更箇所を把握したほうが良いと思いますので、あえて、同じようなコードを3つ書いてます。
$keyword = '//'; に変更すれば以前のものと同じく先頭から3件が出力されます。
条件に合致する情報が無い場合のことを考慮して、最終出力に件数などを追加してあります。
正規表現という要望なのでpreg_matchを用いていますが、
単純な文字列検索であればmb_strposなどを使うほうが処理として早くなる場合があります。
http://php.net/manual/ja/function.mb-strpos.php
<?php //ブログなどのRSS FEEDのURL設定 //$rssdata = simplexml_load_file("http://b.hatena.ne.jp/hotentry?mode=rss&cname=elec"); // rdfのURL例 はてなブックマーク //$rssdata = simplexml_load_file("http://ideblog.info/feed"); // rss2.0のURL例 $rssdata = simplexml_load_file("http://blogs.yomiuri.co.jp/olympic2012/atom.xml"); // atomのURL例 // 検索キーワードを設定 $keyword = '/柔道/'; // 最大読み込み件数を設定 $num_of_data = 3; //出力内容を空っぽに初期化 $outdata = ""; // 読み込みカウンタも初期化 $count_of_data = 0; if ($rssdata->getName() == 'feed') { // atom の場合の処理 $children = $rssdata->children('http://www.w3.org/2005/Atom'); // 記事ループ foreach ($children->entry as $myEntry) { $myTitle = $myEntry->title; //タイトル取得 if (preg_match($keyword, $myTitle)) { $myDate = $myEntry->published; //日付取得 //リンクURL取得 $myAttr = $myEntry->{'link'}->attributes(); $myLink = $myAttr['href']; //出力内容にタイトル(リンク付)を入れる $outdata .= '<h3 class="posttitle"><a href="' . $myLink . '">' . $myTitle . '</a></h3>' . "\n"; //出力内容に日付けを入れる $outdata .= '<p class="postdate">' . $myDate . '</p>' . "\n"; //設定した読み込み件数分だけ取得できたらループを抜ける if (++$count_of_data == $num_of_data) { break; } } } } elseif ($rssdata->getName() == 'rss') { // rss2.0 の場合の処理 // 記事ループ foreach ($rssdata->channel->item as $myEntry) { $myTitle = $myEntry->title; //タイトル取得 if (preg_match($keyword, $myTitle)) { $myDate = $myEntry->pubDate; //日付取得 $myLink = $myEntry->link; //リンクURL取得 //出力内容にタイトル(リンク付)を入れる $outdata .= '<h3 class="posttitle"><a href="' . $myLink . '">' . $myTitle . '</a></h3>' . "\n"; //出力内容に日付けを入れる $outdata .= '<p class="postdate">' . $myDate . '</p>' . "\n"; //設定した読み込み件数分だけ取得できたらループを抜ける if (++$count_of_data == $num_of_data) { break; } } } } elseif ($rssdata->getName() == 'rdf') { // rss1.0 の場合の処理 // 記事ループ foreach ($rssdata->item as $myEntry) { $myTitle = $myEntry->title; //タイトル取得 if (preg_match($keyword, $myTitle)) { $myDate = $myEntry->pubDate; //日付取得 $myLink = $myEntry->link; //リンクURL取得 //出力内容にタイトル(リンク付)を入れる $outdata .= '<h3 class="posttitle"><a href="' . $myLink . '">' . $myTitle . '</a></h3>' . "\n"; //出力内容に日付けを入れる $outdata .= '<p class="postdate">' . $myDate . '</p>' . "\n"; //設定した読み込み件数分だけ取得できたらループを抜ける if (++$count_of_data == $num_of_data) { break; } } } } echo $rssdata->getName() . "\n"; echo $keyword . 'の検索結果は' . $count_of_data . "件です\n"; echo $outdata; //全部出力する echo "End\n";