• ベストアンサー

○○を含まない、という検索方法

namiri_eの回答

  • namiri_e
  • ベストアンサー率37% (37/98)
回答No.2

○○、△△、□□などの除外するものがこれ以上に増えていくのなら配列にするのが良いですね。 next;があるので何かのループの中ですね。 (データファイルを読み込むループでしょうか) まずループの外でフォームから送信されたデータについて、先に除外するかどうか判別しておきます。 @jogai = ('○○','△△','□□','以下同様に'); $flag = 0; foreach (@jogai) { if ($FORM{'name'} =~ m/$_/) { $flag = 1; last; } } このforeach文でフォームから送信されたデータに該当の文字を含むものにフラグを立てておきます。 あとは該当部分をフラグの有無を判別するように少し書き換えればいけると思います。 if (!$flag && $name eq $FORM{'name'}) { ; } else { next; } 「$●● =~ m/■■/」の書き方の詳細は「正規表現」で検索してみてください。

関連するQ&A

  • cgiのカスタマイズが上手く行きません

    http://www.rescue.ne.jp/ のサイトにあります 「簡易データベース」http://www.rescue.ne.jp/cgi/database/ のカスタマイズが上手く行きません。 登録の項目を「名前」「星座」「血液型」に絞り登録をし、 「星座」「血液型」の項目選択で両方が一致した人の 「名前」を検索結果に出そうと思っています。 「改造箇所 index.html・・・フォームのカスタマイズ regist.html・・・フォームのカスタマイズ regist.cgi・・・#入力チェック部分、{'EMAIL'}の削除(未使用のため) search.cgi・・・      ($d,$NAME,$BLOOD,$BIRTH) = split(/\,/,$data);      とし、それぞれ $data = $data2 = $BASE[$num]; &jcode'convert(*data,'euc');      ($d,$NAME,$BLOOD,$BIRTH) = split(/\,/,$data); # 血液型 if ($FORM{'BLOOD'} ne 'all') { if ($BLOOD eq $FORM{'BLOOD'}) { ; } else { next; } } # 誕生日 if ($FORM{'BIRTH'} ne 'all') { if ($BIRTH eq $FORM{'BIRTH'}) { ; } else { next; } } と改造。と、最小限のカスタマイズをしたつもりですが、どうしても ●ご指定の条件では見当たりませんでした. となり、検索に引っかかりません。 データ自体はcsvedit.cgiで確認しても、登録はされているようです。 原因、お分かりになりますでしょうか? 何卒!何卒!よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • データベースCGIでの検索方法

    某データベースCGIを改造して何とか使えるようにしようとしています。 検索してヒットしたもののみ表示させる部分なのですが、どのようにしたら実現できるかさっぱりです。 やりたいことは数値でヒットした物のみ表示です。 検索フォームにドロップダウンリストとして 1 ; ~10 2 ; 11~50 3 ; 51~100 … 10 ; 2,000~ と言う風にセットします。 データは3桁区切りのカンマが入ったものが保存されています。 どのようにして検索させればいいのでしょう? 普通にif文で if($FORM{'data'} eq '1'){ if($data =< 10){ ; } else { next; } } elseif($FORM{'data'} eq '2'){ if($data => 10 && $data =< 50 ){ ; } else { next; } } ~~ という書き方であっているのでしょうか? そのものずばりの回答がとてもありがたいですけど、 参考となるCGIがあったらそれの紹介もあわせてお願いします。

  • 一致する文字としない文字があるのですが

    会員のログイン等で、氏名(漢字)と生年月日でログインするように してあるのですが、「眞」や「はしご高」などの文字が、 フォームで渡ってきた場合に、 データと一致しなくエラーとなってしまいます。 if (!open(IN,"$file")) { &error('データベースエラー','.'); } @BASE = <IN>; $all = @BASE; close(IN); if ($FORM{'FF'} eq '') { $FF = 0; } else { $FF = $FORM{'FF'}; } $TO = $FF + $page - 1; if ($TO > $#BASE) { $TO = $#BASE; } $hit = 0; $next_num = ''; foreach $num ($FF .. $#BASE) { $data = $data2 = $BASE[$num]; &jcode'convert(*data,'euc'); ($d,$NO,$REM,$DATE,$NAME,$EMAIL,$PMAIL,$AGE,$SEX,$PREF) = split(/\,/,$data); # 名前(一致) if ($NAME5 ne 'dadada') { if ($NAME eq $FORM{'NAME'} ) { ; } else { next; } } # 生年月日(一致) if ($AGE5 ne 'kakak') { if ($AGE eq $FORM{'AGE'} ) { ; } else { next; } } # 検索終了処理 if ($hit == $page) { $next_num = $num; last; } else { push(@NEW,$data2); $hit++; } } と検索の部分はなっております。 エラーが出る漢字は少ないのですが、 ログインできないお客様がいて困っています。 なにか対処方法はございますでしょうか? 何卒、宜しくお願い致します。

    • 締切済み
    • CGI
  • 検索結果数の表示(○件ヒット)by CGI rescue

    CGI rescueさんの簡易データベース v2.1を利用しています。 物はこちらです。 http://www.rescue.ne.jp/cgi/database2/ (バージョンが3になっていますが、検索部分は同じのようです。) これで、検索結果が何件ヒットしたのかを表示させたいです。 スクリプト内に「$hit」があったので、そのまま利用しようとすると、"1ページの表示数(またはそれ以下)"を表示してしまいます。 30件ヒットして1ページに20件表示の場合、1ページ目は「20件ヒット」、次ページは「15件ヒット」と表示されてしまいます。 どうにかして全部の検索件数を表示させることは出来ないでしょうか?

    • ベストアンサー
    • Perl
  • 検索cgiについて

    こんにちは。 私は今、不動産物件検索のcgi(フリー)を設置したのですが、検索の『賃料』の箇所のプログラムの記述がよく分かりません。 リストボックスで1万円~5万円など、下限と上限を選択して検索する項目です。 一致する条件の項目は下記のように記述しました。 # 地区(一致) if ($FORM{'CHIKU'} ne 'all') { unless ($CHIKU eq $FORM{'CHIKU'}) { next; } } 含まれる文字を条件にする項目は下記のようにしました。 # 間取り(含む) if ($FORM{'TYPE'} ne '') { if ($TYPE =~ /^([\x00-\x7F]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE]{2})*$FORM{'TYPE'}/i) { ; } else { next; } } abc~xyzという風に範囲指定して検索するにはどのように記述すればよろしいか教えてもらえませんでしょうか?

    • 締切済み
    • CGI
  • perlで正常に検索できない

    CGI RESCUE さんの 簡易データベースでdatファイルを検索しようとしています。。 http://www.rescue.ne.jp/cgi/database/ キーワードで検索をしようとしているのですが、うまくヒットしません。 CGIは以下のようになっています。 # キーワード(フリーワード)  if ($FORM{'keyword'} ne '') {   if ($com5 =~ /^([\x00-\x7F]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE]{2})*$FORM{'keyword'}/i) { ; }   elsif ($com4 =~ /^([\x00-\x7F]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE]{2})*$FORM{'keyword'}/i) { ; }   else { next; } } $com5には「スズキ用<br>ドアトリム<br>バックミラー」と入っていたとします。 「スズキ」または「ドア」・「ドアトリム」・「トリム」と入力すると、ヒットします。 「バック」または「バックミラー」で検索するとヒットしません。 改行が悪いのかと思い、 $com5を「スズキ用ドアトリムバックミラー」に修正してみました。 同じように「スズキ」等はヒットするのですが、「バック」または「バックミラー」で検索するとヒットしません。 「バックミラー」と言う語句がヒットしないのかと思ったのですが・・・ $com5を「バックミラードアトリムスズキ用」に修正したとします。 「バック」・「バックミラー」でヒットします。 また、「ドア」・「トリム」まではヒットしますが、「スズキ」・「スズキ用」になるとヒットしなくなります。 全くヒットしなかったり、動作しないわけではないので、そもそもが間違っているとかではなく検索する部分で何か文字数制限があるような感じですが、これはどこを修正したら良いでしょうか? 他に情報を記入しないといけない物があれば指摘お願いします。

  • 検索で二つが一致した場合「OK」と表示させたいのですが

    こんにちは、いつもお世話になっております。 早速質問失礼します。 以前「名前を検索して一致した場合」出身地等を表示するのを作ったのですが、これを「名前とパスを検索して一致した場合」OKと表示させたいのです。 ーーーーーーーーーーーーーーー open(rd,"./file.txt"); @file = <rd>; close(rd); foreach $ww2 (@file){ ($name,$pass,$shushin,$other) = split(/,/,$ww2); chomp($name); chomp($pass); chomp($shushin); chomp($other); $PS{$name} = $pass; $SHU{$name} = $shushin; $OTHER{$name} = $other; } @name1 = keys ( %SHU ); #???? my $FOUND = 0; foreach $string (@name1){ if($string eq $FORM{'item1'}){ $FOUND = 1; print "見つかった名前:$string <br>     出身地:$SHU{$string} <br>     その他:$OTHER{$string}\n"; } } unless($FOUND){print"見つかりません!再度入力してください!";} ーーーーーーーーーーーーーーーーーー 上記を if($string eq $FORM{'item1'})の後にさらにifで if($string eq $FORM{'item1'}){ if($string eq $FORM{'item2'}){ print "OK"; } } という感じにしたのですが動いてくれません。 一つの検索のときはきちんと動くのですが二つになるとさっぱりです。 プログラムの書き込みをお願いできますでしょうか? それと、@name1 = keys( %SHU ); #???? こちらの一文はどういうことに使われてるのかが良くわかりません。 申し訳ないですが解説の方宜しくお願い致します。

    • ベストアンサー
    • Perl
  • 最新のファイルのみ検索

    サーバー内のファイルを検索するのにKentWebさんのwwwsrch.cgiを利用しています。 # # すべてのファイルをなめ回す # sub search1 { local($dir) = $_[0]; local(@filelist, $file, $filename); opendir(DIR, $dir); @filelist = readdir(DIR); closedir(DIR); foreach $file (@filelist) { if ($file eq ".") { next; } if ($file eq "..") { next; } $filename = "$dir/$file"; if (-d $filename) { if ($recursive_flag) { &search1($filename); } } else { &search2($filename, $dir); } } } # # ファイルの中身を検索する # # 指定していない拡張子のファイルは無視する $suffix = ".html .cgi .pl"; $fname = substr($target, rindex($target, ".")); if ($suffix{$fname} != 1) { return; } ↑の条件に30日以上古いファイルを無視するように改造することはできないでしょうか? 検索対象ファイルが数十万以上と莫大に増加してきたため、最新のファイルのみ検索対象にできればと考えております。

    • ベストアンサー
    • Perl
  • 検索後の「見つかりません」がたくさんでてしまいます。

    こんにちは!初歩的な質問失礼致します。 HTMLで名前を検索して、見つけると名前・出身地・その他を表示するというプログラミングを作っています。 検索にひっかかるときちんと表示されるとこまでいったのですが、検索で引っかからなければ「見つからない」と表示させようとして、elseをつかうと「見つからない」がたくさん出てきてしまい困っています。 サブルーチン・番兵君を使えば良いと書いてありますがはっきしどう使えばいいかわかりません。 下記がプログラムの一部なのですが open(rd,"./file.txt"); @file = <rd>; close(rd); foreach $ww2 (@file){ ($name,$shushin,$other) = split(/,/,$ww2); chomp($name); chomp($shushin); chomp($other); $SHU{$name} = $shushin; $OTHER{$name} = $other; } @name1 = keys ( %SHU ); foreach $string (@name1){ #chomp($string); #print "$string と$FORM{'item1'}<br>"; if($string eq $FORM{'item1'}){ print "見つかった名前:$string <br>     出身地:$SHU{$string} <br>     その他:$OTHER{$string}\n"; } } 「見つからない!」を一回だけ表示させるにはどうしれば良いでしょうか? 申し訳ないですが上記にプログラムを追加して、解説の方宜しくお願い致します。

    • ベストアンサー
    • Perl
  • if文について

    if文を利用してリストの表示をしようとしています。 ドロップダウンリストは <SELECT name="type"> <OPTION value="all">指定しない </OPTION> <OPTION value="1">タイプA系列</OPTION> <OPTION value="2">タイプB系列</OPTION> となっています。 データはチェックボックスで1か空白で保存されていて、A系列は「s_1」「s_2」、B系列は「s_3」「s_4」「s_5」にチェックが入っているかどうかを振り分けしたいんです。 なので、ドロップダウンリストで「タイプA系列」を選択したら「s_1」「s_2」に1が入っている物のみ表示するというものです。 現在のところこの形です。 if ($FORM{'type'} ne 'all') { if ($FORM{'type'} eq '1'){ if ($s_7 || $s_8 eq 1) { ; } else { next; } }else{ if ($s_9 || $s_10 || $s_11 eq 1) { ; } else { next; } } } このようにやってみましたが全部表示されてしまいます。 どのように直したらOKでしょうか? お願いします。

    • ベストアンサー
    • Perl