PHPで今日は何の日か調べる

(1/1)
Wikipedia には、指定した月日のできごとが記録されている。
これを PHP でスクレイピングすることで、今日は何の日か表示するプログラムを作成する。

サンプル・プログラムの実行例

PHPで今日は何の日か調べる

サンプル・プログラム

解説:今日は何の日を取得

0124: /**
0125:  * 今日は何の日 取得
0126:  * @param int $month, $day 月,日
0127:  * @param array $items 情報格納配列
0128:  * @return int 情報件数
0129: */
0130: function getDayToday($month$day, &$items) {
0131:     $pat1 = "/<span[\s\S]+id=\"できごと\".+編集<\/a>/iu"; //ver.1.21
0132:     $pat2 = "/<span[\s\S]+id=\"誕生日\".+編集<\/a>/iu"; //ver.1.21
0133:     $pat3 = "/<span[\s\S]+id=\"忌日\".+編集<\/a>/iu";     //ver.1.21
0134:     $pat5 = "/<li>[^\>]+([0-9]+年.+)<\/li>/iu";         //年 - 内容
0135:     $pat6 = "/([^0-9]*)([0-9]+)年[ \-]+(.+)/iu";         //年 - イベント
0136:     $pat7 = "/([^0-9]*)([0-9]+)年[ \-]+([^、]+)、?([^(\(]+)*[^0-9]*([0-9]*)/iu";
0137:                                                     //年 - 名前、職業(生没年)
0138: 
0139:     $url = getURL_Wikipedia($month$day);
0140: 
0141:     $infp = @fopen($url, 'r');
0142:     if ($infp == FALSE)     return FALSE;
0143: 
0144:     $mode = '';
0145:     $cnt = 1;
0146:     while (! feof($infp)) {
0147:         $str = fgets($infp);
0148:         if (preg_match($pat1$str) == 1) {
0149:             $mode = 'event';
0150:         } else if (preg_match($pat2$str) == 1) {
0151:             $mode = 'birth';
0152:         } else if (preg_match($pat3$str) == 1) {
0153:             $mode = 'death';
0154:         } else if ($mode != '' && preg_match($pat5$str$arr) > 0) {
0155:             $str = strip_tags(trim($str));
0156:             if ($mode == 'event' && preg_match($pat6$str$arr) == 1) {
0157:                 $items[$mode][$cnt]['year']  = ($arr[1] == '') ? (int)$arr[2] : 0 - $arr[2];
0158:                 $items[$mode][$cnt]['event'] = $arr[3];
0159:                 $cnt++;
0160:             } else if (preg_match($pat7$str$arr) == 1) {
0161:                 $items[$mode][$cnt]['year']  = ($arr[1] == '') ? (int)$arr[2] : 0 - $arr[2];
0162:                 $items[$mode][$cnt]['name']    = $arr[3];
0163:                 $items[$mode][$cnt]['profile'] = $arr[4];
0164:                 $items[$mode][$cnt]['plus']    = $arr[5];
0165:                 $cnt++;
0166:             }
0167:         }
0168:     }
0169:     fclose($infp);
0170: 
0171:     return $cnt;
0172: }

Wikipedia には、「できごと」「誕生日」「忌日」に分かれて記録されている。
これらを正規表現 $pat1$pat6 を使ってスクレイピングする関数が getDayToday である。

解説:今日は何の日をソート

0174: /**
0175:  * 今日は何の日 年号順にソート
0176:  * @param array $sour ソート前配列
0177:  * @param array $dest  ソード後配列
0178:  * @return int 情報件数
0179: */
0180: function sortDayToday($sour, &$dest) {
0181:     $cnt = 0;
0182: 
0183:     //できごと
0184:     foreach ($sour['event'] as $item) {
0185:         $dest[$cnt]['year']  = $item['year'];
0186:         $dest[$cnt]['event'] = $item['event'];
0187:         $cnt++;
0188:     }
0189:     //誕生日
0190:     foreach ($sour['birth'] as $item) {
0191:         $event = "{$item['name']}({$item['profile']})誕生";
0192:         if ($item['plus'] != '')    $event .= "(~{$item['plus']}年)";
0193:         $dest[$cnt]['year']  = $item['year'];
0194:         $dest[$cnt]['event'] = $event;
0195:         $cnt++;
0196:     }
0197:     //命日
0198:     foreach ($sour['death'] as $item) {
0199:         $event = "{$item['name']}({$item['profile']})死去";
0200:         if ($item['plus'] != '')    $event .= "({$item['plus']}年~{$item['year']}年)";
0201:         $dest[$cnt]['year']  = $item['year'];
0202:         $dest[$cnt]['event'] = $event;
0203:         $cnt++;
0204:     }
0205: 
0206:     //ソート
0207:     usort($destfunction ($a$b) {
0208:         return $a['year'] - $b['year'];
0209:     });
0210: 
0211:     return $cnt;
0212: }

ユーザー関数 getDayToday によって取得した「できごと」「誕生日」「忌日」を年号順にソートする関数が sortDayToday である。
組み込み関数  usort  を利用し、年号順に配列をソートしている。

活用例

きょうは何の日?:みんなの知識 ちょっと便利帳」では、このサンプル・プログラムを活用し、情報を見やすくレイアウトしている。ありがとうございます。
(この項おわり)
header