で区切られた文字列を * array( * 'id'=>, * 'rss'=> ) * 形式にして返す * */ function rss_log_parse($_text){ list($id,$rss) = explode("<>",$_text); //id,rssから前後の空白削除 $id = trim($id); $rss= trim($rss); return array('id'=>$id,'rss'=>$rss); } /* * 関数名:get_rssList * 概要 :RSSログファイルからパースした配列を返す *  ファイル読み込みに失敗したらエラー終了 * 結果配列 * array( * array( * 'id'=>, * 'rss'=> * ) * ) * */ function get_rssList($_file){ //ファイルの存在チェック if( @file_exists($_file) == FALSE){ err("Error : Log file not exists!!\n"); exit; } //ログファイルから各行を配列に保存 //1行の長さは最大4096byteまで $fp = @fopen($_file, "r"); if (!$fp){ err("Error : Log file Can\'t open!!\n"); exit; } while (!feof($fp)) { $line_texts[] = fgets($fp, 4096); } fclose($fp); //各行にそれぞれパース実行 foreach($line_texts as $text){ //空行はパースしない $text = trim($text); if( empty($text) )continue; //パース実行。 $dat = rss_log_parse($text); if( $dat === FALSE){ continue; } //結果をret配列に保存 $ret[] = $dat; } return $ret; } /* * 関数名:rss_log_parse * 概要 :<>で区切られた文字列を * array( * 'id'=>, * 'rss'=> ) * 形式にして返す * */ function get_RSS($_uri){ global $out_put_character,$max_contents_length,$max_entry_from_one_rss; /** * RSSファイルへのURIをコンストラクタの引数に渡す */ $rss =& new XML_RSS($_uri); /** * RSSファイルをパースする */ $rss->parse(); /** * チャンネル情報の取得 */ $channel = $rss->getChannelInfo(); $channel =array_map("encode",$channel); /** * 全item要素を取得 */ $ret = array(); $cnv_item = array(); foreach ($rss->getItems() as $item) { //エンコード変換 $cnv_item=array_map("encode",$item); //記事の日時取得 if( isset($cnv_item['pubdate']) ) $time = parse_pubDate($cnv_item['pubdate']); if( isset($cnv_item['dc:date']) ) $time = parse_w3cdtf($cnv_item['dc:date']); //記事の文字数制限 $contents = mb_substr($cnv_item['description'],0,$max_contents_length,'utf-8'); //返すタグを設定 $entry = array(); $entry['title'] = '' .$cnv_item['title'] . ''; $entry['time'] = $time; $entry['site'] = ''. $channel['title'] . ""; $entry['site_title'] = $channel['title']; $entry['site_url'] = $channel['link']; $entry['contents'] = $contents; $entry['contents_url'] = $cnv_item['link']; $entry['contents_title'] = $cnv_item['title']; $ret[] = $entry; } usort($ret,"entry_sort"); //1つのRSSフィードからの記事数を制限 if( $max_entry_from_one_rss > 0){ $ary = array_chunk($ret ,$max_entry_from_one_rss); $ret = $ary[0]; } return $ret; } function entry_sort($a,$b){ if ($a['time']['timestamp'] == $b['time']['timestamp']) { return 0; } return ($a['time']['timestamp'] > $b['time']['timestamp']) ? -1 : 1; } function parse_pubDate($pubDate) { $timestamp = strtotime($pubDate); $dt = getdate($timestamp); $result = array("year" => $dt['year'], "month" => sprintf("%02d",$dt['mon']), "day" => sprintf("%02d",$dt['mday']), "hour" => sprintf("%02d",$dt['hours']), "minute" => sprintf("%02d",$dt['minutes']), "second" => sprintf("%02d",$$dt['seconds']), "timestamp" => $timestamp); return $result; } function parse_w3cdtf($datetime) { // Year if(preg_match("/^(\d{4})$/", $datetime, $val)) { $year = $val[1]; // Year and month } elseif(preg_match("/^([0-9]{4})-(0[1-9]|1[0-2])$/", $datetime, $val)) { $year = $val[1]; $month = $val[2]; // Complete date } elseif(preg_match("/^([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/", $datetime, $val)) { $year = $val[1]; $month = $val[2]; $day = $val[3]; // Complete date plus hours and minutes } elseif(preg_match("/^([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])T([0-5][0-9]):([0-5][0-9])(Z|(\+|-)[0-5][0-9]:[0-5][0-9])$/", $datetime, $val)) { $year = $val[1]; $month = $val[2]; $day = $val[3]; $hour = $val[4]; $minute = $val[5]; $timezone = $val[6]; // Complete date plus hours, minutes and seconds } elseif(preg_match("/^([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])T([0-5][0-9]):([0-5][0-9]):([0-5][0-9])(Z|(\+|-)[0-5][0-9]:[0-5][0-9])$/", $datetime, $val)) { $year = $val[1]; $month = $val[2]; $day = $val[3]; $hour = $val[4]; $minute = $val[5]; $second = $val[6]; $timezone = $val[7]; // Complete date plus hours, minutes, seconds and a decimal fraction of a second } elseif(preg_match("/^([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])T([0-5][0-9]):([0-5][0-9]):([0-5][0-9]).([0-9]+)(Z|(\+|-)[0-5][0-9]:[0-5][0-9])$/", $datetime, $val)) { $year = $val[1]; $month = $val[2]; $day = $val[3]; $hour = $val[4]; $minute = $val[5]; $second = $val[6]; $fraction = $val[7]; $timezone = $val[8]; // Not W3C-DTF } else { return false; } // Offset of Timezone for gmmktime() if($timezone != "Z") { $offset_sign = substr($timezone, 0, 1); $offset_hour = substr($timezone, 1, 2); $offset_minute = substr($timezone, 4, 2); } $timestamp = gmmktime($hour - ($offset_sign . $offset_hour), $minute - ($offset_sign . $offset_minute), $second, $month, $day, $year); $result = array("year" => $year, "month" => $month, "day" => $day, "hour" => $hour, "minute" => $minute, "second" => $second, "fraction" => $fraction, "timezone" => $timezone, "timestamp" => $timestamp); return $result; } function time_from_contents($contents){ $ptn = "/(\d{4}\/\d{2}\/\d{2}\(.*?\) \d{2}:\d{2}:\d{2})/"; preg_match($ptn,$contents,$match); $result = $match[0]; return $result; } /* * 関数名:convert_rss_data * 概要 :RSSデータをテンプレートで使える形に整形 * 入力 $rss_data RSSデータ * 出力 整形済みRSS配列 */ function convert_rss_data($rss_data){ global $max_entry_number; //rssデータの整形 $i=1; foreach($rss_data as $key => $dat){ $data['entry'][] = array( "NO" => $i, "SITE" => $dat['site'], "SITE_TITLE"=> $dat['site_title'], "SITE_URL" => $dat['site_url'], "TITLE" => $dat['title'], "CONTENTS" => $dat['contents'], "CONTENTS_TITLE" => $dat['contents_title'], "CONTENTS_URL" => $dat['contents_url'], "DATE" => $dat['time']['year']."/".$dat['time']['month']."/".$dat['time']['day']." ", "TIME" => $dat['time']['hour'].":".$dat['time']['minute'] ); $date['time'][] = array( "DATE" => $dat['time']['year']."/".$dat['time']['month']."/".$dat['time']['day']." " ); if( $max_entry_number == $i) break; $i++; } return $data; } /* * 関数名:make_template_from_rss * 概要 :指定されたファイル名でテンプレートHTMLを作成 * 入力 $file_name 出力ファイル名 * $rss_data RSSデータ * */ function make_template_from_rss($output_file,$template_file,$rss_data){ global $output_html_mode; if( !file_exists($template_file) ){ err('テンプレートファイルが見つかりません。'); exit; } //テンプレートからHTMLテキスト取得 $template = new clsTemplate; $html_text = $template->template($template_file,$rss_data); //HTMLテキスト保存 $fp = fopen($output_file,"w"); fputs($fp,$html_text); fclose($fp); //chmod($output_file,$output_html_mode); return $html_text; } ?>