質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Q&A

解決済

1回答

3897閲覧

perl フォーム入力 文字列の判定について

退会済みユーザー

退会済みユーザー

総合スコア0

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

0グッド

0クリップ

投稿2015/10/14 08:00

ユーザがwinPCからフォーム入力するwebDBシステムにおいて
入力(=DB登録)を許可するのは以下の文字列のみとしたい場合

1.全角かな
2.全角漢字
3.全角カタカナ
4.半角英字
5.半角数字
6.半角の特定の記号 + - x / ( ) &

フォーム値の判定の書き方で数日なやんでおります。

スクリプトの文字コードはutf-8です。
データベースのロケール?もutf-8です。

日本語処理は
・Encodeモジュール
・Encode::Japaneseモジュール
を使います。

各パラメータの値を
全角の英/数字/記号 を 半角英数字に自動変換
半角カタカナ を 全角カタカナ に自動変換した上で
上記6.以外の記号や環境依存文字をエラー判定するには??

NG例) * % $ # " < ㈱ ③ Ⅷ など

ちなみに現行システム(EUC Jcode時代)は以下のサブルーチンを汎用的に使用していますが
機種依存文字も通ってしまう事が判明しています。

#-----------------------------#
sub kmoji_check{
#-----------------------------#
#ASCIIの範囲とJIS X 0208で定義している文字、
#X 0201(半角カナ \x8E[\xA1-\xDF])を除き、
#その他の文字・バイトが含まれるとエラーにします。

#ただし、空白文字以外の制御文字、DELETE、
#X 0212文字(旧漢字等)があってもエラーにします。

local($_) = $_[0]; $flg_err = 0; unless( /^(?: [\s\x21-\x7E]| [\xA1\xB0-\xCE\xD0-\xF3][\xA1-\xFE]| \xA2[\xA1-\xAE\xBA-\xC1\xCA-\xD0\xDC-\xEA\xF2-\xF9\xFE]| \xA3[\xB0-\xB9\xC1-\xDA\xE1-\xFA]|\xA4[\xA1-\xF3]| \xA5[\xA1-\xF6]|\xA6[\xA1-\xB8\xC1-\xD8]| \xA7[\xA1-\xC1\xD1-\xF1]|\xA8[\xA1-\xC0]| \xCF[\xA1-\xD3]|\xF4[\xA1-\xA6]| \x8E[\xA1-\xDF] )+$/x ) #↑+ なので空文字列も不可。/x があるので、正規表現の中に改行を入れられる。 {$flg_err = 1;} if(/\x27/){$flg_err = 1;} #シングルクォートはエラー

}

こんな風に入力許可できる文字コードと各パラメータの値を
パターンマッチで判定するしかないのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

文字コード自分にはムズカシすぎ、、「やりたい処理ができる=禁止したい文字が登録されない」事を優先して以下のような処理にしました。かなり恥ずかしいけど晒しておきます。

①フォーム側でpattern属性で半角英数を排除する

<input type="text" class="form-control" name="s_name" id="s_name" value="[% s_name %]" placeholder="入力必須 10文字以内の全角かな漢字" maxlength="10" pattern="[^\x20-\x7E]*" required>

②フォームの値を 全角→半角 に変換

Unicode::Japanese->new($入力値)->z2h->get

③入力禁止記号が使われていたらエラーメッセージ出力

our @NG_SYMBOL = qw( # 入力を許可しない記号の配列
"
'
~中略~
$
%
);

sub symbol_check{
my $str = @_;

foreach my $s(@NG_SYMBOL){
if($str =~ /\Q$s\E/){
&error_view($pname,"$str には入力禁止記号の $& が含まれています");
}
}

}

投稿2015/10/19 06:45

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問