#!/usr/local/bin/perl ;# 簡易サーチエンジン jSearch v2.00 jsearch.cgi ;# (c)rescue.ne.jp ;# このシステムはホームユース(一般的な小さな個人ホームページ)で手軽にサーバ内のファイルを ;# 検索するもので、単純全文検索ですので、ご利用サーバのCGI制限の範囲内でご利用ください。 ;# History ;# 26/Jun/98 v1.00 初版 ;# 6/July/98 v1.10 @TARGETで設定した最後のディレクトリしか認識されないバグを修正 ;# 17/Dec/98 v1.11 全角文字マッチの不具合の訂正 ;# 20/Jan/99 v1.12 検索手法のミスの修正 ;# 01/Sep/99 v2.00 EUC変換にjcode.plとnkfの併用,配列読込せずにメモリ消費量を軽減化 ;# (注意) ;# HTMLファイルのタイトルは、題名 が1行で書かれていないと検出されません。 #-------------------------------------------------------------------------------------------- # 例えば、 < >内はパーミッションの相当値 # # ~rescue/ (最上位URL/パス) # | # |-- cgi/ # | |-- jsearch/ # | |-- jsearch.cgi <755> # | # |-- cgi-bin/ # | |-- jcode.pl <644> # | # |-- foo/ # | |--bar/ # # という構成であるとし、トップの ~rescue/ にある *.html と cgi/ 内の *.html と *.txt および foo/ 内の *.html および foo/bar/ 内の *.txt を探して検索する # 場合は下記のような位置関係の設定をします。戻るでは、ホームページに戻るような設定です。 # これを参考にして位置関係とその相対設定の記述の仕方を覚えてください。 #日本語コード変換ライブラリ require "../../cgi-bin/jcode.pl"; #日本語変換フィルタ(サーバ管理者に聞く) $nkf = "/usr/local/bin/nkf"; #このスクリプト(jsearch.cgi)から見た検索対象の最上位域までのパス 最後に/を忘れずに $base = '../../'; #ホームページディレクトリ(最上位URL) 最後に/を忘れずに http://から書いても可 $baseurl = '/~rescue/'; #設定 $body = ''; #$baseで設定した位置から見た検索対象パス この書式(ワイルドカード)でいくつでも設定可能 @TARGET = ('*.html','cgi/*.html','cgi/*.txt','foo/*.html','foo/bar/*.txt'); #タイトル $title = 'サーバ内検索'; #戻るリンク $modoru_url = '/~rescue/'; #-------------------------------------------------------------------------------------------- if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name,$value) = split(/=/,$pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; &jcode'convert(*value,'euc'); if ($name eq 'search_strings') { $str = $value; $value =~ s/(\W)/\\$1/g; } $FORM{$name} = $value; } if ($buffer eq '' || $FORM{'search_strings'} eq '') { &html; exit; } #-------------------------------------------------------------------------------------------- $start = (times)[0]; #---START---# chdir($base); foreach $target (@TARGET) { $list = `ls $target`; @lists = split(/\s+/,$list); push(@files,@lists); } @search_strings = split(/\\\s+/,$FORM{'search_strings'}); &jcode'convert(*str,'sjis'); #-------------------------------------------------------------------------------------------- $| = 1; foreach $file (@files) { $string = ""; open(DB,"$nkf -e < $file |"); while () { s/(\n|\r|\t)//g; $string .= " $_"; } close(DB); if ($FORM{'ronri'} eq 'AND') { $found{$file} = 1; foreach $moji (@search_strings) { unless ($string =~ /^([\x00-\x7F]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE]{2})*$moji/i) { $found{$file} = 0; last; } } } else { $found{$file} = 0; foreach $moji (@search_strings) { if ($string =~ /^([\x00-\x7F]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE]{2})*$moji/i) { $found{$file} = 1; last; } } } if ($found{$file}) { if ($string =~ /(.+)<\/title>/i) { $title{$file} = $1; } else { $title{$file} = $file; } } } #-------------------------------------------------------------------------------------------- if ($FORM{'ronri'} eq 'AND') { $houhou="論理積(かつ)"; } if ($FORM{'ronri'} eq 'OR') { $houhou="論理和(または)"; } print "Content-type: text/html\n\n"; print "<html><head><title>検索結果\n"; print "$body\n"; print "

検索結果

\n"; print "
  • 検索文字列: $str
    \n"; print "
  • 絞り込み方法\: $houhou

    \n"; $foo = 1; print "

      \n"; foreach $key (keys %title) { $foo = 0; $ttl = $title{$key}; &jcode'convert(*ttl,'sjis'); print "
    1. $ttl\n"; } if ($foo) { print "
    2. 抽出なし\n"; } print "

    \n"; $end = (times)[0]; #---end---# printf "That took %.3f CPU seconds.

    \n", $end - $start; print "[戻る]

    \n"; print "


    jSearch v2.00

    \n"; print "\n"; exit; #-------------------------------------------------------------------------------------------- sub html { print <<"EOF"; Content-type: text/html\n $title $body

    $title

    検索文字列 (複数入力の場合は半角スペースで区切る)

    複数入力の場合の絞り込み方法

    [戻る]

    EOF }