- ベストアンサー
大文字と小文字を区別しない検索にする方法
勉強する間もなく手探りでフリーCGIの改造をさせて頂いています。 if ゃ foreach などは分かりやすいですが、変数の意味が良く理解できていません。 どうぞお力添えをお願い致します。 現在、フリーのCGIでデータ登録と検索をしていますが、大文字と小文字の 区別を無くしたものにするにはどうすればよいでしょうか? 1) AbcDe も abcde も同じにしたい。 2) 可能なら全角と半角も区別無しにしたい。 ただ、2の方は漢字も使うので難しいでしようか? iオプションを使えとの記述を見ましたが、どこを変えるのか解りません。 ソースを載せますので、ご指導宜しくお願い致します。 # 入力内容を整理 $in{'word'} =~ s/\x81\x40/ /g; @wd = split(/\s+/, $in{'word'}); @find=(); $i=0; # 検索処理 foreach (@line) { $flag = 0; foreach $wd (@wd) { if (index($_,$wd) >= 0) { $flag = 1; if ($in{'cond'} eq 'OR') { last; } } else { $andor="and 検索"; if ($in{'cond'} eq 'AND') { $flag=0; last; } $andor="or 検索"; } } # ヒットした場合 $view = $in{'viewc'}; if ( $view eq '' ) { $view = $views } if ($flag) { $i++; next if ($i < $page + 1); next if ($i > $page + $view); push(@find,$_); } } # 検索終了
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ShiftJIS コードの場合、漢字コードの2バイト目に正規表現の区切り文字やメタ文字と同じ コードがあるためうまくいかないことがあります。英単語のみ正規表現を使って、それ以外は index を使えばうまくいくかもしれません。 > if (index($_, $wd) >= 0) { 上の行を次のように変更してみてください。なお、英単語に can't や Dr. などがある場合は、 /^\w+$/ を /^[\w.']+$/ などに変更する必要があります。 if ($wd =~ /^\w+$/ ? $_ =~ /$wd/i : index($_, $wd) >= 0) {
その他の回答 (3)
- LOHA
- ベストアンサー率52% (203/388)
index($_, $wd) >= 0 の部分を $_ =~ /$wd/i とすればどうでしょ。 間違ってたらすみません。
お礼
検索用語でNGな時とOKな時を比較すると「ー」の含まれた場合に 上手く行かないようです。 「スタート」とか、「パレード」の「ー」です。 何か対処方法がございましたらご教示お願い致します。 それと不思議なのですが、何故 $_ =~ /$wd/i を index($_, $wd) >= 0 のように記述されていたのでしょうか? 簡単に略していたなら分かるのですが、文字数増えてますよね? どんな意図があるのでしょう…
補足
レスありがとうございます。 index($_, $wd) >= 0 の部分を $_ =~ /$wd/i に変えると、英小文字の大文字と小文字の区別はなくなりました。 ただ、副作用でしょうか…全角文字を混ぜた検索をすると、上手く動作しない場合が多いです。 まだ上手く行かないときのパターンがよく分からないので、調べてみます。
- tom233
- ベストアンサー率17% (61/352)
>iオプションを使えとの記述を見ましたが、どこを変えるのか解りません。 これは正規表現の場合です。 #1さんの人の言うように検索処理を正規表現にすれば使えます。
補足
レスありがとうございます。 正規表現にしようと記述してみましたが、CGIが動かなくなってしまいました。 具体的に記述を教えて頂けると助かります。 自分の知識不足で、お手数をお掛け致しますが何卒宜しくお願い致します。
- LOHA
- ベストアンサー率52% (203/388)
えーとPerlですね。Perlは読むだけでもうぎゃーですのでとりあえず参考になりそうなサイト見つけたので見てみてください。 Perlメモ:http://www.din.or.jp/~ohzaki/perl.htm ここに全角を半角にする方法などが乗ってます。ただし、jcode.pl使ったりなので、そのままでは環境によっては無理かも。 iオプションを使えというのは正規表現のiオプションを使えという意味です。 正規表現についてはこちらを参照。 正規表現 [Perl講座 -Smart]:http://www.rfs.jp/sb/perl/02/09.html えーっと比較してるところは、、、index($_, $wd) >= 0っぽいのでここをオプションiの正規表現に変えたらどうでしょう。
補足
レスありがとうございます。 教えていただいたページ読ませていただきましたが、知識不足も甚だしく 記述形式が分かりませんでした。 まずは大文字と小文字の区別をせずに検索するようにしたく思いまして、 パターンマッチ m// 演算子でオプション「i」を使うのは分かったのですが 具体的な記述はどうすればよいのでしょうか? いくつか試してみたのですが記述が不味く、CGI自体にアクセスできなくなってしまいました。 お手数お掛け致しますがどうぞ宜しくお願い致します。
お礼
先程、時間が空いたので試してみました。 とても上手く行きました。 非常に使いやすくなりました。 本当にありがとうございました。 if ($wd =~ /^\w+$/ ? $_ =~ /$wd/i : index($_, $wd) >= 0) { を自分でサクサク書けるように、時間を作って勉強したいと思います。
補足
レスありがとうございます。 早く試したくてワクワクしているのですが、今日は時間が取れそうに 無いので、明日以降に試させて頂きたいと思います。 ぜひ、英単語に can't や Dr. などがある方で試したいと思ってます^^ また結果報告させていただきます。