人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPの正規表現について
以下のソースを参考にしてください。
http://1811way.com/work008/source20120728-02.txt
を参照してください。

タイトルの中に、たとえば「柔道」という文字列があったら、
$outdata
の中にいれる、という構文に変えたいのですが
わかりません。

上記ソースの
$myTitle = $myEntry->title; //タイトル取得
の後にif文を入れるのだと思います。

ソースを変えていただけると助かります。
よろしくお願いします。

●質問者: kohhi
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● y-kawaz
●100ポイント

修正しました。

<?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) {
 //略
}


kohhiさんのコメント
早速お返事いただき、ありがとうございます。

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";

kohhiさんのコメント
早速お返事いただきありがとうございます。 できました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ