- ベストアンサー
データ検索について
フォームに文字を入力し検索ボタンを押すと、データベースから入力された文字を含む文章のみを出力するcgiを作ったのですが、特定の文字[房]を入れると真っ白画面が出てしまいます。他の文字では正常に動作するのですが、何か対策はありますでしょうか。 ソースは非常に簡単で、下記のようなものです。 if ($bunsyou =~ /$keyword/){&output;} $bunsyou:データベースの中の一つの文章 $keyword:フォームで入力した文字
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
フォームから受け取った文字をシフトJISにデコードしていませんか? シフトJISの「房」の2バイト目は 0x5B(つまり [ )であり、これは正規表現のメタ文字であるため、/$keyword/ でエラーとなっているのではないかと思います。 このようなメタ文字を無効化するには、/\Q$keyword\E/ のように \Q ~ \E で挟んでやります。 また、特に問題がないなら、 if (index($bunsyou, $keyword) != -1) { &output; } のように index を使うと、メタ文字を心配する必要もなく、効率も数倍は良くなります。
その他の回答 (1)
- moon_piyo
- ベストアンサー率60% (88/146)
回答No.1
if ($bunsyou =~ /$keyword/){&output;} ↓ if ($bunsyou =~ /\Q$keyword\E/){&output;} "房" = "\x96\x5b"(sjis) = "\x96[" なので正規表現のなかで「房」をつかうと "\x96["の[が文字クラス[]の開始とみなされて うまくいってないのでは?
質問者
お礼
ご回答ありがとうございます。 うまく行きました。
お礼
回答ありがとうございました。 indexを使ってみます。 非常に助かりました。