のフリー、シェアCGI・PHPスクリプト・JavaScriptをキーワード、97のカテゴリーから検索できます。スクリプトの登録ご利用は一切無料です。


フリー、シェアCGI・PHPスクリプトをキーワード、96のカテゴリーから検索できます。

 スクリプトをお探しなら当サイトでOK

  •  フリー、シェアのCGI・PHPスクリプトをメインに検索。
  •  ランキングによる評価で人気のスクリプトを紹介。
  •  サンプル(ページ)によるダウンロード前の事前評価。
  •  お気に入りスクリプトへのパーソナルリンクの作成。

 スクリプト登録のメリット

  •  シェアスクリプトでも、掲載は一切無料。
  •  細かなカテゴリー(全97項目)で閲覧者に分かり易く分類。
  •  スクリプトを印象づけるサンプル(ページ)の登録が可能。
  •  ダウンロードランキングの実施による人気度の評価。

当サイトはQ&A掲示板(コミュニティ)の窓口を共有して下さるサイト様を募集しています。

[Q&A掲示板] 共有サイト様募集!

サイト内検索機能拡張-2


今度は、サイト内検索に検索したワードをページを表示したときに目立つように表示させる機能を追加します。
これは、ページへのリンクを貼るのではなく、ページを読み込んで、正規表現で文字列を変換して出力することで実現できます。

#!/usr/bin/perl
@SEARCH = ('html', 'htm', 'shtml');

if($ENV{'REQUEST_METHOD'} eq "POST") {
   read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
} else {
   $query = $ENV{'QUERY_STRING'};
}
@args = split(/&/, $query);
foreach $i (@args) {
   ($name, $val) = split(/=/, $i);
   $name =~ tr/+/ /;
   $name =~ s/%([0-9a-fA-F]{2})/pack('C', hex($1))/eg;
   $val =~ tr/+/ /;
   $val =~ s/%([0-9a-fA-F]{2})/pack('C', hex($1))/eg;
   $in{$name} = $val;
}

$in{'word'} =~ s/ / /g;

@word = split(/ /, $in{'word'});

# ページの表示
if($in{'url'}) {
	# もしページが見つからなければエラーで終了
	unless(-e $in{'url'}) {
		print "Content-ype: text/html\n\n";
		print "エラー!:ファイルが存在しません!\n";
		exit;
	}

	# ファイルの読み出し
	open(DATA, "< $in{'url'}");
	@line = <DATA>;
	close(DATA);

	# 出力
	print "Content-type: text/html\n\n";
	foreach $l (@line) {
	  # 検索ワードと一致した文字列を目立つように変換
	  foreach $w (@word) {
		  # タグ内部にあるワードは退避
		  $l =~ s/(<[^>]+?)($w)([^<]+?>)/$1# 退避 #$3/gi;
		  # ワードにタグを付けて修飾
		  $l =~ s/$w/<u><b>$w<\/b><\/u>/gi;
		  # 退避したワードの復帰
		  $l =~ s/# 退避 #/$2/gi;
	  }
	  # BODYタグの終わりにオリジナルのファイルへのリンクを貼る
	  $l =~ s/<\/body>/<center><a href="$in{'url'}">オリジナルファイルへ<\/a><\/center>\n<\/body>/i;
	  print $l;
	}
	exit;
}

unless($in{'word'}) {
   print "Content-type: text/html\n\n";
   print "検索ワードを入力してください!\n";
   exit;
}

opendir(DIR, "./");
while($file = readdir(DIR)) {
   my($f) = 0;
   foreach(@SEARCH) {
      $f = 1 if($file =~ /$_$/);
   }
   next unless($f);
   $f = 0;
   open(DATA, "< $file");
   my(@line) = <DATA>;
   close(DATA);
   undef(%tmp);
   foreach $w (@word) {
      foreach $l (@line) {
         $rank{$file} += $l =~ s/$w/$w/gi;
         if($l =~ /<title>(.+)<\/title>/i) {
            $title{$file} = $1;
         }
         if(!exists($tmp{$w}) && $l =~ /$w/i) {
            $tmp{$w} = 1;
            $f++;
         }
      }
   }
   unless($title{$file}) {
      $title{$file} = 'タイトルなし';
   }
   if($f == @word) {
      push(@url, $file);
   }
}
closedir(DIR);

$n = @url;

print "Content-type: text/html\n\n";
if($n) {

   foreach(sort { $rank{$b} <=> $rank{$a} } @url) {
     # URLのエンコード
     $url = $_;
	 $url =~ s/\%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
	 # ワードのエンコード
	 $in{'word'} =~ s/\%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
     print "・ <a href=\"test.cgi?url=$url&word=$in{'word'}\">$title{$_}</a> 信用度($rank{$_})\n<br>";
   }
} else {
   print "一致するワードはありませんでした。\n";
}

ページの表示部が新たに追加され、検索に一致したURLの出力部が変更されました。
検索に一致したURLを出力するときに、検索ワードとURLには必ずエンコード処理をします。
エンコード方法は、クッキーの時に利用した方法と同じです。

ページ表示のとき、もしかしたらファイルが存在しないかもしれないので、エラー処理として出力します。
ここで、重大なセキュリティホールがあるのにお気づきでしょうか。
このURLに、system.cgi といったような重要なCGIへアクセスされた場合には、その内容がすべて出力されてしまいます。
万一、そのCGIにパスワードなどが書かれていた場合には、最悪な状態に陥ります。
なので以下の処理を必ず行ってください。

$f = 0;
foreach(@SEARCH) {
   $f = 1 if($in{'url'} =~ /$_$/);
}
unless($f) {
   print "Content-type: text/html\n\n";
   print "不正行為!そのファイルへのアクセスは認められません!\n";
   exit;
}

これは、最初に定義した検索対象であるファイル形式以外がURLで指定された場合は、不正行為とみなしエラー出力します。
この処理が欠けた場合には、重大な損害を被る可能性がありますので、注意してください。

ワードの修飾処理は、検索部の要領と同じです。
しかし、置換する場合には、置換するワードがタグ内に書かれているかどうかに注意が必要です。
もし、タグ内のワードを置換してしまった場合、レイアウトが崩れるだけでなく、リンクが正常に作動しない恐れがあります。
なので、タグ内にあるワードは一旦退避させてから、置換処理を行い、それが終われば退避したワードを復帰させます。

最後に、万が一レイアウトが崩れて正常に表示されないことを考慮して、オリジナルのページへのリンクを貼っておきます。

scriptEYE