• ベストアンサー

AND検索がうまくできない

登録したデータを検索するPerlを制作しています。 #$in{word}は入力されたキーワードで、半角スペースまたは全角スペースでキーワードを分割 @word = split(/\s| /,$in{word}); $count = @word; #@dataは検索対象となるデータ foreach $data (@data){  $a = 0;  while ($a < $count){   if($data =~ /$word[$a]/){    push(@query, $data);    last;   }   $a++;  } } こんな感じでAND検索できるようにしてみたのですが、エラーになります。 Perlチェックをかけてみると構文はOKと出ます 複数語、つまりAND検索でなく1つの言葉(@wordが1つだけ)の場合はうまくいきます また、逆にif($data =~ /$word[$a]/){をなしにしてやれば(これをはずすと検索にならず全ヒットになりますが)複数ワードでも正しく表示されます $aや$count、@word、$word[$a]などが正しくできていないのかと思い、それを表示させて確認してみましたが、きちんと代入され、やりとりできているようなのですが、どこに問題があるのでしょうか。 数日間ネットで調べ、色々試し、本も開いて色々検証しましたがどうしてもわかりません。 間違いをご指摘ください PS プログラム部分の右へインデントしているところは半角スペースやタブだとこのページでは無視されるようなので、見やすくするため全角スペースでずらしていますが、実際のプログラム中ではここに全角スペースなんぞ使っておりません

  • choei
  • お礼率63% (286/451)
  • Perl
  • 回答数4
  • ありがとう数3

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

  • ベストアンサー
  • ryu_chan
  • ベストアンサー率37% (69/186)
回答No.4

No.3のkumozさんが書いておられるようにShift-JISだと第2バイトが正規表現 のメタ文字とかぶってエラーになることが多々あります。 とりあえず、kumozさんがおっしゃるように use strict; use warnings; use CGI::Carp qw(fatalsToBrowser); を追加して、エラーを捕捉したほうがいいですね。 use strict; use warnings; も追加しておくとバグが入りにくいコードが書け るようになると思います。 Shift-JISは何かとバグが出るので、use utf8としてUTF-8にするか、EUC-JPに するのも手だと思います。 手っ取り早く解決するには、 if($data =~ /$word[$a]/){ を、 if($data =~ /\Q$word[$a]\E/){ として、メタ文字を無効化する方法もあります。 あと、検索をするなら正規表現よりindexを使ったほうが高速で動作するでお薦 めです。and検索のサンプルコードとして以下はいかがでしょうか? my @words = split(/\s| /,$in{word}); foreach my $data (@data) { my $hit_count = grep index($data, $_) >= 0, @words; if ( $hit_count == @words ) { push @query, $data; } }

choei
質問者

お礼

ありがとうございます 教えて頂いたサンプルコードの形ですっきり綺麗に解決できました 一旦UTF-8に変換して表示用にShift-JISに戻したりしていたら、マッチに関してのエラーはなくなったものの、文字化けが出てくる箇所が出たりして別の悩み抱えてしまっていましたが、教えて頂いたコードでUTF-8に変換せずにやってみたところ、うまくいきました。 大変感謝しております。 ご教授ありがとうございました。 教えて頂きました他の方法やコードも合わせて今回勉強したいと思います。

その他の回答 (3)

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.3

CGI ファイルの先頭付近に標準モジュールの use CGI::Carp qw(fatalsToBrowser); の文を入れ てみてはどうでしょうか。このモジュールは、失敗した原因をブラウザに表示してくれるので 問題解決に役立つと思います。 何が原因なのかは分からないのですが、SJIS コードで書いている場合、全角スペースの2バイト 目が @ と同じコードのため悪さをすることがあります。単純な $var = "abc def"; 文も正常に 実行することができません。今回のケースとは違うように思いますが、参考までに。

choei
質問者

お礼

ありがとうございます。 教えて頂いたコードを追加してエラーを捕捉してみました Unmatched [ in regex; marked by <-- HERE in m/^■■■ <-- HERE ■■■ / at hoge.cgi line ○○. このようなエラーとなったので、ネットで調べてみましたら、Shift-Jisの関係でのエラーとなっているようです http://www.nishishi.com/blog/2006/02/unmatched_in_re.html このページにそのものズバリのエラーの記述がありました 一旦UTF-8にするなどして対策してみます。

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.2

>  if($data =~ /$word[$a]/){ >   push(@query, $data); >   last; >  } キーワードがひとつでもマッチしたら @query に push しているので AND 検索じゃなく、OR 検索に なっています。

choei
質問者

お礼

ありがとうございます。 たしかにor検索になってました 別の問題でしたが、大きな間違いでした もしわかればなぜエラーになるかもご指摘ください よろしくお願いします

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「エラーになります」と書かれていますが, エラーメッセージは出ないのですか? 出ているのであればどのようなエラーメッセージなのか書いてください.

choei
質問者

補足

スペルに自信ありませんが、Internal Server Errorです

関連するQ&A

  • 絞込み検索(and検索)について

    PHPの勉強をしています。色々試してみたのですが解決までいたらなかったのでご相談させて頂きます。 テストで検索を掛けたら下記のようなエラーが発生しました。 Warning: mb_convert_encoding() [function.mb-convert-encoding]: Unable to detect character encoding in C:\Program Files\xampp\htdocs\PHPSAMPLE\sample_php\search.php on line 19 上記のエラーは $KeyWord=mb_convert_encoding($KeyWord,"Shift_JIS","auto"); を外す事でエラーにならず検索する事ができました。 ■ソース --------------------------------------------------------------------------- 13 if($_GET["key"]==""){ 14 print"キーワードを入力してください"; 15 }else{ 16 $KeyWord=$_GET["key"]; 17 $KeyWord=htmlspecialchars($KeyWord); 18 $KeyWord=mb_convert_encoding($KeyWord,"Shift_JIS","auto"); 19 $KeyWord=mb_convert_kana($KeyWord,s); 20 $ArrKeyword=explode(" ",$KeyWord); --------------------------------------------------------------------------- つづいて、区切りに使われるスペースを「半角」「全角」どちらでも対応できるように 「全角スペース」が入力された場合、すべて半角スペースに統一するようになっているはずなんですが 例)フルーツ リンゴ と全角スペースで絞り込んだ場合。検索結果が0と表示されてしまいます。 半角スペースで絞り込んだ場合。表示結果が1件と正常に表示されます。 ■ソース --------------------------------------------------------------------------- 13 if($_GET["key"]==""){ 14 print"キーワードを入力してください"; 15 }else{ 16 $KeyWord=$_GET["key"]; 17 $KeyWord=htmlspecialchars($KeyWord); 18 $KeyWord=mb_convert_kana($KeyWord,s); 19 $ArrKeyword=explode(" ",$KeyWord); --------------------------------------------------------------------------- mb_convert_kanaで「全角」スペースを「半角」に変換するように設定し explodeで文字列を半角スペースで分割するようにしているはずなんですけど うまく機能しません。。。 記述方法が間違っているのか?何かがたらないのか? 自分なりに考えたのですが改善策が見つかりません。 どなたか知恵を貸して頂ければと思います。 宜しくお願いいたします。

    • 締切済み
    • PHP
  • ヤフー検索エンジンの検索のやり方(キーワードについて)

    ヤフー検索エンジンの検索のやり方(キーワードについて) A(半角スペース)B(半角スペース)C この場合は、AかつBかつCの意味ですか?それともAまたはBまたはCの意味ですか? もし、半角スペースで区切った時が、デフォルトでAND検索になるならば、 OR検索にするにはどうするんでしょうか? また A(全角スペース)B(全角スペース)C の場合は、半角スペースと違うんですかね?? 上記のことはgoogleでの検索フォームへの入力でも意味は同じですよね? ド素人なこと聞いてすいません・・・

  • 自作の検索エンジンを作成しました。AND検索 or 検索の方法をご教授いただきたい。

    こんにちは。 複数のキーワードの検索が出来ません。 ゲーム 無料 等のキーワードで検索した場合のwhere句とのコラボ組み合わせが出来ません。 $keyword=$_POST[1]; $rs=$DB->$query("SELECT * FROM data WHERE"; if($keyword){ $str = array(" ", " and ", " AND "); $keyword = str_replace($str, " ", $keyword); if(stristr($keyword, " ")){//複数キーワードの検索 $ex = explode(" ", $keyword); $count = count($exkey); for($i=0; $i<$count; $i++){ if($i!="0"){ $sql = $sql." and"; } $sql = $sql." keyword LIKE '%{$ex[$i]}%'"); } }else{//単体キーワードの検索 $sql = " keyword LIKE '%{$keyword}%'"); } } $query = $query.$sql; $result = mysql_query($query); ...結果表示 これ今のソースですけど for のあたりに何か必要ない文字とか入っていますか。 色々しているうちに無駄に複雑にしてしまっているのではと言う感じもします。

    • ベストアンサー
    • PHP
  • Perl アンド検索

    恐れ入ります。 perlにて、&検索を実行する為に、以下のようにしています。 しかしうまく動作しません。 use CGI $word = $form->param('word'); open (IN<, "xxx.txt"); $rec=<IN>; $where="$rec ne '' "; if($word ne ''){ $word =~ s/ / /g; @word_array = split(/ / , $word); foreach (@word_array){ $where .= "and $rec=~/$_/ "; } } if($where){ @rec=split(/,/, $rec); //省略 xxx.txtを$recに格納して、フォームより送信されてきたスペース区切りの語句を、分割し、各々をマッチさせて検索したいのですが、 どのようにしたらよいでしょうか。よろしくお願いします。

    • ベストアンサー
    • Perl
  • AND検索がきちんとできません

    PHP、MYSQLの勉強を始めたばかりの者です。 AND検索をしたいのですが…… きちんと検索できません。 データの中身 データタイトル|キーワード A|テスト B|サンプル 以下のようにすると、「テ」「ス」でAのデータは出てくるのですが、 「テ」「サ」で検索すると、 一つもでてこないはずなのに、Bのデータが出てきます。 「サ」「テ」ですとAのデータがでてきてしまいます。 何故でしょうか。 自分なりに考えてはみたのですが、お手上げ状態です。 何卒、宜しくお願いします。 <form method="GET" action="sample.php"> <input type="text" name="q" size="20"> <input type="submit" value="search"> </form> <?php require_once 'dbmanager.php'; $pdo = getDb(); // クエリ設定 if (isset($_GET['q'])) { $q = htmlspecialchars($_GET['q']); //クエリを入力 $q = str_replace(" ", " ", trim($q)); $words = explode(" ",$q); } // 解析 $tmp = []; $wd = []; $i = 0; foreach($words as $word) { if(!empty($word)) { $tmp[] = " keyword LIKE :word".$i." "; $wd[] = '%'.$word.'%'; $i++; } } // SQL if(count($tmp) > 0){ $sql = "SELECT * FROM ttables WHERE (".implode("AND",$tmp).") ORDER BY id DESC"; $search_sql = $pdo->prepare($sql); foreach($wd as $key => $word){ $search_sql->bindParam(':word'.$key, $word); } $search_sql->execute(); // while while($row = $search_sql->fetch(PDO::FETCH_ASSOC)) { print"<li>{$row['keyword']}{$row['title']}</li>"; } }

    • ベストアンサー
    • PHP
  • 検索エンジン等でスペース(AND検索?)を入れて検索する時

    検索エンジン等で2つ以上の単語の間にスペース(AND検索?)を入れて検索する時に、一般的にそのスペースは半角スペースにするよう言われていますが、スペースを全角にすると何が変わるのでしょうか? 実際やってみても検索数に違いは無いようです。 ご存知の方宜しくお願い致します。

  • Twitterの検索の仕方について

    ハッシュタグを付けても、付けなくても検索できますが、どっちがいいですか? 日本人の情報取集ツールとしては(最速)何がおすすめですか? (インスタ、ティックトック、フェイスブック、5ch、爆さい等) 検索のとき、半角のハッシュタグを付けるのは分かるのですが、キーワードを複数検索のときは、半角スペース?全角スペース?スペース空けない?のどれですか? 初心者です。すいませんが、よろしくお願いいたします。

  • フリーワード検索

    PHPでフリーワード検索を行おうと思っていますが。 スペースが入った場合などはどのようにしたらいいのでしょうか? 空白も全角と半角のものがありますよね? 一度、全角スペースを見つけて、なかったら半角スペースをみつけて、という形になるのでしょうか? うまく、どちらともまとめて見つけることができるのでしょうか??

    • ベストアンサー
    • PHP
  • 複合キーワードで検索し、マッチしたデータを表示

    <input type="text" />に「お弁当 卵焼き」 と検索した場合、 この2つのキーワードを含むデータを表示させたいのですが解決できません。 2つのキーワードの間は半角スペース、もしくは全角スペースとします。 どなたかわかる方いらっしゃればお願いします。

    • ベストアンサー
    • PHP
  • Word2007の全角文字、全角スペースの検索方法

    またまた質問申し訳ありません。 Word2007の書類で、全角文字、全角スペースが混じってて、これらを検索して特定したいのですが、 やり方がいまいちわかりません。 過去の質問から、[!0-9a-zA-Z]を入力すれば半角文字以外を検索できるみたいですが、 半角のスペースやコンマを検索してしまいます。 これらの半角スペースやコンマを検索したくないのですが、検索からはずすにはどうすればよいでしょうか?