• 締切済み

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を「バックミラードアトリムスズキ用」に修正したとします。 「バック」・「バックミラー」でヒットします。 また、「ドア」・「トリム」まではヒットしますが、「スズキ」・「スズキ用」になるとヒットしなくなります。 全くヒットしなかったり、動作しないわけではないので、そもそもが間違っているとかではなく検索する部分で何か文字数制限があるような感じですが、これはどこを修正したら良いでしょうか? 他に情報を記入しないといけない物があれば指摘お願いします。

みんなの回答

  • pringlez
  • ベストアンサー率36% (598/1630)
回答No.6

>これをutf-8用に改造できないでしょうか? >(私自身は方法が全然わからないので、修正個所・記述をそのまま教えていただけるとありがたいです) 改造は可能でしょう。ただし自己責任で行うべきです。 自分では方法はわからないという人は絶対にやるべきではありません。 使用しているスクリプトで元から想定している文字エンコーディングで使用するのが一番の解決方法です。 しかしそうではなく、自分の好きな文字エンコーディングを使用したい、機能についても元のものと似ていなければならないなどというのであれば、開発会社に依頼し作成してもらうのがいいでしょう。無料でできる範囲には限りがあるのは当然です。条件をいろいろつけるのであれば有料になるのは当たり前だと考えられるようにならなければならないと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • pringlez
  • ベストアンサー率36% (598/1630)
回答No.5

>検索フォームページ・プログラム・DATファイル共にUTF-8で保存してます。 そうですか。それが原因の可能性が高いと思います。 CGI RESCUE チャレンジCGI - 改行コード/漢字コードについて http://www.rescue.ne.jp/cgi/crlf/ このページには # 当サイトのスクリプトは、特に指定が無い限り、 SJISで作成しており、 # SJISのまま設置することで動作するように設計しています。 と書いてあるので、ファイルをSJISに変換して試してみてください。ただ、上記の正規表現を見るとEUCっぽく見えるんですよね。なので、SJISにしてだめならEUCにしてみてください。 SJISかEUCのどちらかならかでなら正しく動くと思います。それでダメなら別のもう少しつくりのいいスクリプトを探した方がいいでしょう。またもしも何が何でもUTF-8を使いたいというのであれば、UTF-8 に対応しているものを探した方がいいでしょう。

master-3rd
質問者

補足

返答ありがとうございます。 今までずっとSJISを利用していたんですけど、文字化けの問題などで全体をutf-8に変えました。 なので、この部分も出来ればutf-8を利用したいです。 これをutf-8用に改造できないでしょうか? (私自身は方法が全然わからないので、修正個所・記述をそのまま教えていただけるとありがたいです) もし不可能な場合、utf-8に対応している別のものを利用したいと思うのですが、似た様なものがどこかで配布されていないでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • pringlez
  • ベストアンサー率36% (598/1630)
回答No.4

ファイルの文字エンコーディングは何ですか? EUC-JPになっていますか?

master-3rd
質問者

補足

返答ありがとうございます。 検索フォームページ・プログラム・DATファイル共にUTF-8で保存してます。 ただ、プログラムには「&jcode'convert(*value,'euc');」の記述がありますね… もしかしてこれが原因でしょうか? もしそうだった場合、どのように書き換えたらよいでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

・外部からデータを取り込むときに Encode::decode で外部表現から内部コードに変換する ・処理自体はすべて内部コードで行う ・外部にデータを渡すときに Encode::encode で内部コードから外部表現に戻す というように記述する.

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

入出力以外は全て内部コードで処理するように書き換える.

master-3rd
質問者

補足

返答ありがとうございます。 どのように記入したら良いのか教えていただけないでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

よほど古くっさい Perl でない限り, こんなわけのわからない正規表現を使うのはアホだと思う.

master-3rd
質問者

補足

返答ありがとうございます。 ではどのように書き換えたらよいのでしょうか? よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 検索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で記号除去を行いたいのですがうまく行かない

    perlで記号除去を行いたいのですがうまく行かず困っています。 文字列はEUCです。そこから$patternのような記号を削除したいのですが・・・。 http://www.din.or.jp/~ohzaki/perl.htm#Character 正しくパターンマッチさせる を参考に $ascii = '[\x00-\x7F]'; $twoBytes = '[\x8E\xA1-\xFE][\xA1-\xFE]'; $threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]'; $pattern=q([\!!\##\%%\--―ーー・・\//\;;\??\\¥__`‘\{{\}}\++\((\))\[[\] ]\**@@\$$&&\::\>>\<<\~ ̄\^^\"”\'’  \,,\..\==\||\、、\。。]); if ($data =~ s/((?:$ascii|$twoBytes|$threeBytes)*?)(?:$pattern)/$1/mg) { print "マッチした $& \n"; } print $data; として$dataに下の2つを与えてみました。 サンプル1 【あいうえお】 サンプル2 【aaa】 ところが・・・ サンプル1 (出力なし) サンプル2 旻aaa桿 何が悪いのかわかりません・・・ ためしにパターンに【】を追加したところサンプル2はうまく行きましたが サンプル1に変化がありません。(あいうえお も消えてしまう) 何か思い当たる点がありましたら教えてください。よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 半角と全角の文字数カウント方法

    半角の一文字を1とカウントし、全角の一文字も1とカウントしたいのですが、うまい方法を教えてください。 例) 1111ああああ → 8文字 11111111 → 8文字 ああああああああ → 8文字 自分なりに調べて見たら以下の命令を見つけたのですが、うまく行かないのです。 $n =~ tr/\x00-\x7f/\x00-\x7f/; $nn =~ tr/\xa1-\xfe/\xa1-\xfe/; 宜しくお願いします。

    • ベストアンサー
    • Perl
  • エクセル 検索機能をつけたい。

    エクセル2003です。初心者です。 エクセルに検索機能をつけたいんです。 Ctrlt+Fで検索自体はできるのですが、 ある部分にキーワードを入力し、検索ボタンを押したら、 そのキーワードが記載されている欄が出てくるようにしたいです。 例えば、名簿があって、鈴木太郎などで検索すると鈴木太郎さんのデータが でてくる。 女で検索したら、その名簿の女性の方々が表示される等です。 やはり難しい作業が必要になりますでしょうか? よろしくお願いいたします。

  • 検索場所を増やすには

    cgiに下記のタグを埋め込んで板の検索をできるようにしたのですが、板のディレクトリがたくさんある場合はどのようにすればいいのでしょうか value="support"のsupportを他の板のディレクトリ名にすると、その板の検索がされるのですが <form action="search.cgi" name="SEARCH" method="POST"><BR>[掲示板内全文検索] キーワードは<b>スペース</b>で区切ってください。<BR>検索語句:<input type="text" name="keyword" size="20"><input type="submit" value="検索"><BR><input type="hidden" name="bbs" value="support"><BR></form>

    • 締切済み
    • CGI
  • 3バイト文字を書きだしたい

    恐れ入ります。 表題の通りなのですが、うまく出来ません>< 3バイト文字の判定が \x8F[\xA1-\xFE][\xA1-\xFE] ということでしたので、 試しに以下のようにしてみたのですが、ダメでした。 for ( 161 .. 254 ){ my $tmp=sprintf("\x8f\xa1\x%x", $_); print $tmp; } 【結果】 a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfe

    • ベストアンサー
    • Perl
  • ページ内検索について(ソースコードのサンプル)

    初めて投稿させていただきます。 ブラウザ上において、「Ctrl+F」でページ内のキーワード検索ができる機能が あると思いますが、この機能を、自作しているホームページに実装したいと 考えています。どのようなソースを記述すればよいか教えていただけませんか。 HTMLだけでは難しいと思うのですが、javascriptの知識が全く無いので困っています。 なお、IEの「Ctrl+F」のように、キーワードがヒットした場合、ヒットしたキーワードが 全て反転し、enterボタンを押すごとに上から順にヒットしたキーワードにページ移動 するようにしたいのです。 宜しくお願いします。

  • データベース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があったらそれの紹介もあわせてお願いします。

  • ホームページ内検索をフォームとJavaScriptで実現したい。

    簡単なホームページを作っているのですが、例えばページ内の特定のテキストを検索する場合は Ctrl+Fで検索できますが、自分で作っているページなので、FORMとJavaScriptを使って キーワードを formのテキストに入力し、検索ボタンを押すと、1つめのfind位置にジャンプし、 ページ内のキーワード全てに黄色の反転をさせたいのですが、可能でしょうか? DOM?というものを詳しく知る必要があると思いますが、お勧めの書籍がありましたら教えてください。

  • 検索窓の設置について

    自身のHP上に検索窓を設置していますが キーワードの入力域は一つでボタンによってサーチエンジンを変えています。 HPの文字コードはEUC-JPで作成しているのですが サーチエンジンの中にEUC-JPに対応していないものがあり、入力したキーワードを認識してくれません。 構造としては htmlで<form action=******.cgi method="GET">として ******.cgiでボタンによってサーチエンジンを振り分けています。 jocde.plでのコンバートも上手くいってないようなので 他に方法があれば教えて下さい。 よろしくお願いします。

    • ベストアンサー
    • CGI