• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:サイト内検索CGI 更新新しい順に表示したい(2))

サイト内検索CGI 更新新しい順に表示したい

このQ&Aのポイント
  • CGIのSite_Searchを使っているのですが、公式サイトが閉鎖してしまっています。
  • Site_Searchの検索結果画面はこんな感じです。http://nihon5ch.net/contents/ch5/site_search.cgi?mode=and&key=%A4%E2%A4%CE&list=40
  • これを、Key Search(http://www.kent-web.com/data/ksearch.html)のように、update(Key Searchでいうところの日付)の新しい順に表示し、「新しい順/古い順」にソートできるようにしたいのです。

質問者が選んだベストアンサー

  • ベストアンサー
  • hok212
  • ベストアンサー率66% (100/150)
回答No.3

ソース確認しました。 私の説明がまずかったのでしょうか。。。何かずいぶんと試行錯誤されているようですね。 もっとシンプルでいいのです。 元のPerlスクリプト(http://delcy.jp/site_search.cgi)をベースに説明します。 ※いままでカスタマイズしたものは、いったん破棄したほうが早いと思います。 ※できれば行数表示が出来るテキストエディタを使ってください。 まずは sub print_form内に、次の並び順選択ボックスを入れます。 ※挿入箇所は検索ボタンの直前がよいでしょう。 <select name="sort"><option value="1" selected>新しい順<option value="0">古い順</select> 次に 268行が空行ですから、ここに次のスクリプトを挿入します。 ※つまり、267行 の print "<table>\n"; と 269行 の foreach ($top..$end) { の間です。 $sortFlag = $in{'sort'}; if($sortFlag eq "") { $sortFlag = 1; } if ($sortFlag == 0) { @ret = sort{(split(/<>/,$a))[3] cmp (split(/<>/,$b))[3]} @hits; } else { @ret = sort{(split(/<>/,$b))[3] cmp (split(/<>/,$a))[3]} @hits; } @hits = @ret; 元スクリプトからカスタマイズする箇所はこれだけです。 実際に私はこれだけのカスタマイズで、新しい順/古い順が正しく動作しています。

CRAFT05
質問者

お礼

できました!! すでにカスタマイズをしてあったのですが、 それと競合するところもあったのかもしれませんね… このあとほかのカスタマイズ箇所も完了させて動作を見てみることにします。 本当に長らくお付き合いありがとうございました!! ------------------- あとでこの記事を参照される方のために… sub print_form内に入れる並び順選択ボックスは、 <>内の「"」をすべて削除して… print "<select name=sort><option value=1 selected>新しい順<option value=0>古い順</select>"; です

その他の回答 (2)

  • hok212
  • ベストアンサー率66% (100/150)
回答No.2

おかしいですねぇ・・・ 先の回答1を記入する前に該当のCGIを実際に動かしてみたのですが、 私がカスタマイズしたものは古い順も新しい順も正しく動作しました。 どこかで間違っているのでしょうが、今の状態ではCRAFT05さんがカスタマイズしたCGIのソースを全部見てみないことには、原因がわかりません。 おそらく単純なミスだと思います。

CRAFT05
質問者

お礼

else { print "$inf_strにマッチするページは見つかりませんでした。\n"; } print "<table>\n"; if ($sortFlag == 0) { @ret = sort{(split(/<>/,$a))[3] cmp (split(/<>/,$b))[3]} @hits; } else { @ret = sort{(split(/<>/,$b))[3] cmp (split(/<>/,$a))[3]} @hits; } @hits = @ret; $sortFlag = $in{'sort'}; if($sortFlag eq "") { $sortFlag = 1; } if ($sortFlag == 0) { @ret = sort{(split(/<>/,$a))[3] cmp (split(/<>/,$b))[3]} @hits; } else { @ret = sort{(split(/<>/,$b))[3] cmp (split(/<>/,$a))[3]} @hits; } @hits = @ret; $sortFlag = $in{'sort'}; if($sortFlag == "") { $sortFlag = 1; } if ($sortFlag == 0) { @ret = sort{(split(/<>/,$a))[3] cmp (split(/<>/,$b))[3]} @hits; } else { @ret = sort{(split(/<>/,$b))[3] cmp (split(/<>/,$a))[3]} @hits; } @hits = @ret; foreach ($top..$end) { ($hfile,$htitle,$hsize,$hupdate,$hinf) = split (/<>/,$hits[$_]); if ($sortFlag == 0) { @ret = sort{(split(/<>/,$a))[3] cmp (split(/<>/,$b))[3]} @hits; } else { @ret = sort{(split(/<>/,$b))[3] cmp (split(/<>/,$a))[3]} @hits; } @hits = @ret; if (! $htitle) { $htitle = "タイトル無し"; } $hfile =~ s/\.+\///g; if ($hsize >= 1000) { $hsize = sprintf ("%.1fkb",$hsize / 1000); } else { $hsize = "$hsize"."b"; } $hupdate =~ s/\*/\,/; $no = $_ + 1; print "<tr><td rowspan=2 align=right valign=top>$no.</td><td><a href=\"http://$url_header$hfile\" target='$target_w'>$htitle</a>"; print "<font color=\"#999999\"><tt> update:$hupdate size:$hsize</tt></font></td></tr>"; print "<tr><td><div class=inf>$hinf"; print "<font color=\"#339966\">http://$url_header$hfile</font></div><p><br></td></tr>\n"; } print "</table>\n"; print "<hr noshade color='$border'>\n"; $end++; if ($view < $total) { $in{'key'} =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; if ($end < $total) { print "<font size=\"-1\"><a href='./$script?mode=$in{'mode'}\&key=$in{'key'}\&list=$end'>次のリストへ</a> </font>|\n"; } else { print "<font size=\"-1\">次のリストはありません</font>"; } $no = 0; for ($i = 0; $i <= $total; $i += $view_lists) { $no ++; if ($top == $i) { print "$no|\n"; } else { print "<a href='$script?mode=$in{'mode'}\&key=$in{'key'}\&list=$i'>$no</a>|\n"; } }} else { print "<font size=\"-1\">次のリストはありません</font>"; } print "<p>\n</div>\n"; &print_form(1); print "<div align=right>\n"; print "<font size=\"-1\"><i><a href=\"http://CGIScriptMarket.com/\" target=_blank title=\"script found at:すえぽんさいと\">Site_Search v.1.0</a></i>\n"; # 著作表示(削除禁止) print "</div>\n</body>\n</html>\n"; exit; sub open_dir { $dir = "$_[0]/"; opendir DIR,$dir; @dir_value = readdir DIR; close (DIR); foreach $value (@dir_value) { if (! ($value =~ /\./)) { push (@list,"$dir$value"); $all_dir++; } else { $c1 = $c2 = 0; foreach $type (@search_type) { if ($value =~ /\.$type/i) { $c1 ++; foreach $pass_f (@pass_files) { if ($pass_f eq "$dir$value") { $c2 ++; } }}} if ($c1 > 0 && $c2 == 0) { push (@list,"$dir$value"); } $all++; }}} sub input { print "Content-type:text/html\n\n"; print "<html>\n<head>\n"; print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\">\n"; print "<title>$page_title</title>\n$style</head>\n$body\n"; print "<font size=-1><BR><IMG SRC=\"parts/00_spacer.gif\" width=\"35\" height=\"2\">■ 「」内検索</font>\n"; &print_form(0); print "<div style=\"margin-left:30px; margin-right:30px;\">\n"; print "<font size=\"-1\" color=\"#999999\">検索範囲:<i>http://$url_header$set_dir</i> 以下</font><p>\n"; print "</div>\n</body>\n</html>\n"; exit; sub open_dir { $dir = "$_[0]/"; opendir DIR,$dir; @dir_value = readdir DIR; close (DIR); foreach $value (@dir_value) { if (! ($value =~ /\./)) { push (@list,"$dir$value"); $all_dir++; } else { $c1 = $c2 = 0; foreach $type (@search_type) { if ($value =~ /\.$type/i) { $c1 ++; foreach $pass_f (@pass_files) { if ($pass_f eq "$dir$value") { $c2 ++; } }}} if ($c1 > 0 && $c2 == 0) { push (@list,"$dir$value"); } $all++; }}} sub input { print "Content-type:text/html\n\n"; print "<html>\n<head>\n"; print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\">\n"; print "<title>$page_title</title>\n$style</head>\n$body\n";

CRAFT05
質問者

補足

$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; $value =~ s/\r\n/\n/g; $value =~ s/\r/\n/g; $value =~ s/<.*?>//g; $value =~ s/ / /g; &jcode'convert(*value,'euc'); $in{$name} = $value; } if ($st_dir) { $set_dir = $st_dir; } else { $st_dir = "."; } if (substr($st_dir,length($st_dir)-1,1) eq "/") { $st_dir = substr($st_dir,0,length($st_dir)-1); } if ($url) { $url_header = $url; } else { $url_header = "$ENV{'SERVER_NAME'}$ENV{'SCRIPT_NAME'}"; } $url_header = substr ($url_header,0,(rindex ($url_header,"\/") + 1)); $url_header =~ s/https?\:\/\///g; while ($set_dir =~ /\.\./) { $set_dir =~ s/\.\.//; $url_header =~ s/(.+)(\/)/$1/; $url_header = substr($url_header,0,(rindex ($url_header,"\/") + 1)); } $set_dir =~ s/\///g; if ($set_dir) { $set_dir .= "/"; } if ($in{'mode'} eq 'test') { &test; } if (! $in{'mode'}) { &input; } elsif ($in{'key'}) { @key = split (/ /,$in{'key'}); } if (! @key) { &input("<b>!</b>検索キーが入力されていません"); } $all_dir = 0; $all = 0; &open_dir($st_dir); foreach $file(@list) { if (! ($file =~ /\.\w/)) { &open_dir($file); } open(FILE,$file); @lines = <FILE>; close (FILE); $inf = $title = $file_val = ""; foreach $line(@lines) { $file_val .= "$line"; } $file_val =~ s/[\r\n\t]//g; if (! $title && $file_val =~ /<title>(.*?)<\/title>/i) { $title = $1; } $file_val =~ s/<head>.*?<\/head>//ig; $file_val =~ s/<.*?>//g; $file_val =~ s/</&lt;/g; $file_val =~ s/>/&gt;/g; $file_val =~ s/ //g; &jcode'convert(*file_val,'euc'); if ($in{'mode'} eq 'and') { $match = 1; foreach (@key) { if (! ($file_val =~ /$_/i)) { $match = 0; } } } else { $match = 0; foreach (@key) { if ($file_val =~ /$_/i) { $match = 1; } } } if ($match == 1) { foreach $key(@key) { $strings = ""; if ($file_val =~ /$key/i) { if ($file_val =~ /$key/) { $pos1 = $pos2 = index ($file_val,$key); } else { $pos1 = $pos2 = 0; } foreach (0..int($inf_strings / 2)) { if ($pos1+$_ >= length($file_val)) { last; } $string = substr($file_val,$pos1+$_,1); if ($string =~ /[\x80-\xff]/) { $string = substr($file_val,$pos1+$_,2); $pos1++; } $strings = "$strings$string"; } foreach (0..int($inf_strings / 2)) { if ($pos2-$_-1 <= 0) { last; } $string = substr($file_val,$pos2-$_-1,1); if ($string =~ /[\x80-\xff]/) { $string = substr($file_val,$pos2-$_-2,2); $pos2--; } $strings = "$string$strings"; } $strings =~ s/($key)/<span>$1<\/span>/ig; $inf = "$inf$strings...<br>"; }} &jcode'convert(*inf,'sjis','euc'); ($size,$update) = (stat $file)[7,9]; ($ups,$upmin,$uph,$upd,$upm,$upy) = (localtime $update)[0,1,2,3,4,5]; $update = sprintf ("%04d\/%02d\/%02d\*",$upy + 1900,$upm + 1,$upd); push (@hits,"$file<>$title<>$size<>$update<>$inf"); }} $total = @hits; $target = @list; foreach (@key) { $keys = "$keys$_ "; } &jcode'convert(*keys,'sjis','euc'); if ($in{'mode'} eq 'or') { $c_or = " checked"; $inf_str = "いすれかの検索キー"; } else { $c_and = " checked"; $inf_str = "全ての検索キー"; } print "Content-type:text/html\n"; print "Pragma: no-cache\n\n"; print "<html>\n<head>\n"; print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\">\n"; print "<title>$page_title</title>\n$style</head>\n$body\n"; print "<font size=-1><BR><IMG SRC=\"parts/00_spacer.gif\" width=\"35\" height=\"2\">■ 「」内検索結果</font>\n"; &print_form(0); print "<div style=\"margin-left:30px; margin-right:30px;\">\n"; print "<font size=\"-1\" color=\"#999999\">検索範囲:<i>http://$url_header$set_dir</i> 以下<br></font>\n"; print "<font size=\"-1\" color=\"#999999\">検索キー:<b>$keys</b></font><p>\n"; $total --; $view = $view_lists - 1; if ($in{'list'}) { $top = $in{'list'}; } else { $top = 0; } $end = $top + $view; if ($end > $total) { $end = $total; } if (@hits) { $i_top = $top + 1; $i_end = $end + 1; $i_total = $total + 1; print "<font size=\"-1\">$inf_strにマッチするページ数: <b>$i_total</b>ページ\n"; print "(内$i_top~$i_endを表\示)</font>\n"; print "<hr noshade color='$border'><br>\n"; }

  • hok212
  • ベストアンサー率66% (100/150)
回答No.1

引き続き回答します。 if($sortFlag == "") { $sortFlag = 1; } この部分ですが、文字列ですので次のようにしないといけませんでした。 if($sortFlag eq "") { $sortFlag = 1; } おそらくこれで希望の動作になります。

CRAFT05
質問者

補足

ありがとうございます!お返事遅くなりました。 やってみたのですが…やはり新しい順にしか表示されません><? どうしてでしょうね; まぁページ数も少ないですし、古い順に見たい人は、 最後のページのリンクをクリックすればよいので、 今の状態でもいいといえばいいので、 hok212さんにあまりご迷惑をかけても申し訳ないですし、 面倒そうなら解決としてもよいのですがどうしましょう?