• ベストアンサー

フォーム入力のチェック

フォームの入力をCGI(Perl)でチェックするとき、 全角の漢字、カタカナ、ひらがなでの入力以外は禁止にしたいです。 どなたかいい方法をご存知でしょうか? とりあえず、現在は、 jcode.plで全角英数字⇒半角英数字に変換 フォームに入力された文字列を一文字(半角2文字)ずつ抽出して、 $a=~ s/([^\w ])/'%' . unpack("H2", $1)/eg; でエンコードしたものが%を含んでいるかどうかで判別してます。 でもこれだと全角英数字と半角英数字しかシャットアウトできません。 記号文字なども入力出来ないようにしたいです。 よろしくお願いします。

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

  • ベストアンサー
  • nipotan
  • ベストアンサー率59% (134/227)
回答No.3

失敬。 いきなりコードから書いたので、何故に EUC-JP なのかとかも書いてなかったですが、EUC-JP なら、全角文字に 7bit 部が含まれていないので、jcode::tr で全角の英数記号を半角 (7bit) にしてしまえば、7bit 文字が存在すれば「禁止文字が入ってる」という理論が成り立ちます。 しかも、先ほど書いた jcode::tr 部分は、某サイトからのコピペだったので、一部間違ってますね (正常に動作しません) ちなみに、半角英数文字を jcode::tr で使用する時、私は以下のような書き方を常用しています。(基本的にコードに全角文字が入ってるのが生理的に嫌いなのでこうしてるんですが。。。) こちらは正常に動作するので、こちらをお使いくだしゃい。 --- &jcode::tr(\$a2euc, (join '', map{ pack('C', hex($_)); } qw(A3 B0 2D A3 B9 A3 C1 2D A3 DA A3 E1 2D A3 FA A1 A1 A1 AA A1 C9 A1 F4 A1 F0 A1 F3 A1 F5 A1 C7 A1 CA A1 CB A1 F6 A1 DC A1 A4 A1 DD A1 A5 A1 BF A1 A7 A1 A8 A1 E3 A1 E1 A1 E4 A1 A9 A1 F7 A1 CE A1 EF A1 CF A1 B0 A1 B2 A1 C6 A1 D0 A1 C3 A1 D1 A1 C1)), '0-9A-Za-z !"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~'); ---

harisun
質問者

お礼

ご回答ありがとうございました。 &jcode'tr(↓の方)を自分なりに修正して使ってみたところ、 うまくいっているみたいです。 どうもありがとうございました。

その他の回答 (2)

  • nipotan
  • ベストアンサー率59% (134/227)
回答No.2

require 'jcode.pl'; # チェック対象文字 $a = 'こんにちは。教えて!goo です'; # 一応、元の文字を保存する my $a2euc = $a; # EUC-JP にする jcode::convert(\$a2euc, 'euc'); # 全角英数記号を半角にする (全角部分は当然 EUC-JP) jcode::tr(\$a2euc, '0-9A-Za-z @!”#$%&’()=-^¥|{}:;+*?_/<>', '0-9A-Za-z @!"#$%&\'()=-^{}:;+*?_/<>'); # 半角文字が入ってたらエラーメッセージ if($a2euc =~ /[\x20-\x7e]/){ print '['.$a.'] にはひらがな、カタカナ、漢字以外が含まれています'; } --- 制御コード (タブや改行) は無視しています。スペースも「禁止文字」なのでエラー扱いになります。スペースぐらいは許したいという場合は、正規表現内の文字クラスを [\x21-\x7e] に変えてください。

  • wolfwood
  • ベストアンサー率50% (199/398)
回答No.1

文字チェックをPerlで行うなら正規表現を用います。 すでにチェックで使われているようなので詳しくは省きます。 もし解らなかったら「正規表現」で検索すればたくさん出てきますよ。 正規表現で文字のコードから半・全角、平仮名、片仮名を判断できます。 下記URLのページにサンプルがたくさん載ってますので参考にしてください。 文字の判定の記述がそのまま載っていますのでそのままコピーして使えると思います。

参考URL:
http://www.din.or.jp/~ohzaki/regex.htm
harisun
質問者

お礼

ご回答ありがとうございました。 教えていただいたurlはこれからも参考になりそうです。

関連するQ&A