アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。

cgi/perlを使用してフォームを作成しています。
フォームの一部に製品入力欄を設けており、
一度の登録申請で1-10まで10個分製品が登録可能です。
それぞれの製品に、販売先、販売日など詳細項目を入力するようになっています。

同じ部分で別の問題も抱えているのですが、
今回は書式設定についてうかがわせてください。

上記販売日をyyyy/mm/ddの書式で入力しないとエラーを返すように以下のように記述しました。

if (($form{'kounyuu_01'} !~ /[\d\d\d\d]+\/[\d\d]+\/[\d\d]/){
&error('販売日の書式が間違っています。');
}

ただこれを10個分書くと01,02,03と末尾を変えただけの記述を何度もしなくてはならず、cgiが長くなってしまうため、まとめて定義したいと考えました。

そこで以下のようにしてみたのですが、
1つ目の製品以外の販売日が入力されていないと上記「'販売日の書式が間違っています。'」のエラーが返ってきてしまいます。
if (($form{'kounyuu_01'} !~ /[\d\d\d\d]+\/[\d\d]+\/[\d\d]/) | ($form{'kounyuu_02'} !~ /[\d\d\d\d]+\/[\d\d]+\/[\d\d]/) | ($form{'kounyuu_03'} !~ /[\d\d\d\d]+\/[\d\d]+\/[\d\d]/) | ($form{'kounyuu_04'} !~ /[\d\d\d\d]+\/[\d\d]+\/[\d\d]/) ....) {
&error('移管日の書式が間違っています。');
}

製品は最低1つの入力は必須ですが、それ以外は任意なので、
入力があった場合だけ書式をチェックするようにしたいのですがこの場合はどのようにすれば良いのでしょうか。
説明が悪くて申し訳ないですがアドバイスをお願い致します。m(__)m

A 回答 (2件)

別の一例をば。


ところで、日付のチェックを厳格に行うなら先頭と最後も指定してやりましょう。
このままだと、

a2006/02/06b
とか
2006/02/060
なんてのも"マッチ"するので書式が違うとはなりません。
そこで、^ で先頭 $ で後方を指定します。




$n = 0;

for(1..10){
$i = sprintf("%02d",$_);
if($form{'kounyuu_'.$i} ne ""){
$n++;
if($form{'kounyuu_'.$i} !~ /^\d{4}\/\d{2}\/\d{2}$/){
&error('販売日の書式が間違っています。');
}
}
}

if(!$n){&error('最低一つ、販売日の入力が必要です。');}
    • good
    • 0
この回答へのお礼

Etherskyさん、
ありがとうございます。こんなにも短い記述で同じ指示ができるんですね!
他の必須項目なども直したくなってきました。。(^^;

今回は入力項目が非常に多いのでEtherskyさんの書き方を流用させていただく事にしました。

ありがとうございました。

お礼日時:2006/02/07 10:17

がると申します。


んっと…色々な手法はあるのですが、一例としてって感じで。

# チェック関数
# 第二引数が1なら必須
sub is_sale_date {
my ($data, $flg) = @_;
unless (defined $flg) {
$flg = "0";
}

# データが空の場合
if ($data eq "") {
# 必須フラグに1がたっていなければ(必須でないなら)
if ($flg ne "1") {
# 正常終了
return "OK";
}
}

# データチェック
if ($data =~ /[\d\d\d\d]+\/[\d\d]+\/[\d\d]/){
# OKなので正常終了
return "OK"
}

# 問題があったのでNG終了
return undef;
}

my $flg = "OK";
unless ( is_sale_date($form{'kounyuu_01'}, "1") ) { $flg = "NG"; }
unless ( is_sale_date($form{'kounyuu_02'} ) ) { $flg = "NG"; }
unless ( is_sale_date($form{'kounyuu_03'} ) ) { $flg = "NG"; }
# 以下続く

# 最終チェック
if ("NG" eq $flg) {
&error('移管日の書式が間違っています。');
}
    • good
    • 0
この回答へのお礼

がるさん、
早速のアドバイスありがとうございます。
アドバイス頂いた通りに作成したら上手く作動しました!

お礼日時:2006/02/07 10:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!