• ベストアンサー

データ検索について

フォームに文字を入力し検索ボタンを押すと、データベースから入力された文字を含む文章のみを出力するcgiを作ったのですが、特定の文字[房]を入れると真っ白画面が出てしまいます。他の文字では正常に動作するのですが、何か対策はありますでしょうか。 ソースは非常に簡単で、下記のようなものです。 if ($bunsyou =~ /$keyword/){&output;} $bunsyou:データベースの中の一つの文章 $keyword:フォームで入力した文字

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

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.2

フォームから受け取った文字をシフトJISにデコードしていませんか? シフトJISの「房」の2バイト目は 0x5B(つまり [ )であり、これは正規表現のメタ文字であるため、/$keyword/ でエラーとなっているのではないかと思います。 このようなメタ文字を無効化するには、/\Q$keyword\E/ のように \Q ~ \E で挟んでやります。 また、特に問題がないなら、   if (index($bunsyou, $keyword) != -1) { &output; } のように index を使うと、メタ文字を心配する必要もなく、効率も数倍は良くなります。

egypt
質問者

お礼

回答ありがとうございました。 indexを使ってみます。 非常に助かりました。

その他の回答 (1)

  • moon_piyo
  • ベストアンサー率60% (88/146)
回答No.1

if ($bunsyou =~ /$keyword/){&output;} ↓ if ($bunsyou =~ /\Q$keyword\E/){&output;} "房" = "\x96\x5b"(sjis) = "\x96[" なので正規表現のなかで「房」をつかうと "\x96["の[が文字クラス[]の開始とみなされて うまくいってないのでは?

egypt
質問者

お礼

ご回答ありがとうございます。 うまく行きました。

関連するQ&A