
#●
#---------------------------------------------------------------------------------------
# 名称     | Search
# Version  | 1.70
# 処理名   | 検索＆抽出処理
# 動作内容 | 読み込まれたログを抽出する
# 引数     | なし
# 戻り値   | なし
#
sub Search {

	if ($in{'str'} ne '') { # 検索文字列がある場合は前処理

		if ($in{'boolean'} eq 'or') { $OR = 'checked'; $MODE = ' <sup>または</sup> '; } # 表示メッセージ用
		elsif ($in{'boolean'} eq 'and' || $in{'boolean'} eq '') { $AND = 'checked'; $MODE = ' <sup>かつ</sup> '; }

		$keys = $target = $in{'str'};
		$keys =~ s/　/ /g; # 全角空白を半角に
		$keys =~ s/</&lt;/g; # 入力域用に変換
		$keys =~ s/>/&gt;/g;
		$keys =~ s/"/&quot;/g;
		$target =~ s/　/ /g;
		$target =~ s/(\W)/\\$1/g; # 非英数字をエスケープ処理
		@keys = split(/\\\s+/,$target); # スペースで分ける
		unless ($keys =~ / /) { $MODE = ''; }
		$keys2 = $keys;
		$keys2 =~ s/ /$MODE/g; # 表示用
	}

	$page_control = $hit = 0;

	foreach $line (@messages) {

		$page_control++;
		if ($page_control < $in{'page_control'}) { next; } # 指定の行数まで読み飛ばす

		($number,$pwd,$date,$name,$email,$host,$title,$mode,$link,$reserve,$value) = split(/\t/,$line,11);
		if ($deleted{$number} == 1) { next; } # 表示しない(削除)記事を読み飛ばす

		if ($in{'str'} ne '') { # 検索文字列がある場合は検索処理

			$value =~ s/\n//; # 改行コードを削除(chopではjperlで正常に削除できない→chompを使うとよい)
			$string = "$name\t$email\t$title\t$value"; # 検索の対象とする文字列

			if ($in{'boolean'} eq 'or') { # 論理和処理(OR)

				$match = 1;
				foreach $term (@keys) { if ($string =~ /$term/i) { $match = 0; }} # １つでも合っているか？
			}
			else { # 論理積処理(AND)

				$match = 0;
				foreach $term (@keys) {	if (!($string =~ /$term/i)) { $match = 1; }} # １つでも合わないものがあるか？
			}

			if ($match == 1) { next; }
		}

		if ($hit != $page) { push(@MESSAGE,$line); $hit++; } # １ページ($page件)に満たない場合は抽出して件数を数える
		else { $next_control = $page_control; last; } # 達したら、ここまで至った行数を次の読み飛ばし行数として指定して終了
	}

	if ($in{'str'} ne '' && !@MESSAGE) { &Error("Not Found","「$keys2」では見当たりませんでした."); } # 検索モードで抽出が無かった場合

}#End_of_Search

