PHPの正規表現について

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

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

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

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

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2012/07/28 23:32:33
  • 終了:2012/07/30 17:16:47

ベストアンサー

id:windofjuly No.2

うぃんど回答回数2625ベストアンサー獲得回数11492012/07/29 00:39:44

ポイント300pt

大きな変更箇所としては、先頭から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";
id:kohhi

早速お返事いただきありがとうございます。
できました。

2012/07/30 15:59:21

その他の回答(1件)

id:y-kawaz No.1

y-kawaz回答回数1419ベストアンサー獲得回数2252012/07/29 00:09:45

ポイント100pt

修正しました。

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

id:kohhi

早速お返事いただき、ありがとうございます。

2012/07/30 15:58:33
id:windofjuly No.2

うぃんど回答回数2625ベストアンサー獲得回数11492012/07/29 00:39:44ここでベストアンサー

ポイント300pt

大きな変更箇所としては、先頭から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";
id:kohhi

早速お返事いただきありがとうございます。
できました。

2012/07/30 15:59:21

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません