- ベストアンサー
GETデータの&で区切った個々のエラー処理について質問です。
GETデータ、たとえば http://www.yahoo.co.jp/test.cgi?data1=1237&data2=AK とある場合、$ENV{'QUERY_STRING'}の中のそれぞれの引数値に個別にエラー処理をかける方法を教えてください。順番はdata2が先頭にくるときもあればdata1が先頭にくるときもあります。data以外の文字はだめです。たとえばcode1=となるとエラーになるようにしたい。data1には数字4文字が入ります。data2には大文字の英字が入ります。 組み合わせはdata1=8544だけのときもありますし、 data1=1234&data2=KOのときもあったりばらばらです。 逆の場合もあります。data2=KO&data1=1234というふうに・・・。$ENV{'QUERY_STRING'} を&で分割して@getにいれてから、@getから&で区切られた個々の値を取り出す方法がわかりません。。。 どなたかご教授ねがいます。よろしくお願いいたします。以下のように書いたのですがうまくできません。 sub err_check{ if ( $FORM{'action'} eq "" ) { local(@get); if($ENV{'QUERY_STRING'} !~ /data1|data2|data3/) { &err2; } if (length($ENV{'QUERY_STRING'}) > 30) { &err2; } (@get)=split(/&/,$ENV{'QUERY_STRING'}); foreach $getname (@get) { ##data1のとき if ($data1){ if ($getname !~ /^media=[0-9]+[0-9]+[0-9]+[0-9]/) { &err2; } if (length($data1) > 6) { &err2; } if (length($data1) < 4) { &err2; } } ##data2のとき if($data2){ if ($getname !~ /^data2=[A-Z]+[A-Z]/) { &err2; } if (length($data2) ne 2) { &err2; } } } }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんな感じでしょうか @get = split( /&/, $ENV{'QUERY_STRING'} ); foreach $_get( @get ) { ( $key, $val ) = split( /=/, $_get ); if( $key eq "data1" ) { print "data1のチェック処理\n"; if( $val =~ /^[0-9][0-9][0-9][0-9]$/ ) { print "data1はOK\n"; } else { print "data1間違い\n"; } } elsif( $key eq "data2" ) { print "data2のチェック処理\n"; if( $val =~ /^[A-Z][A-Z]$/ ) { print "data2はOK\n"; } else { print "data2間違い\n"; } } }
その他の回答 (1)
- masayuki0511
- ベストアンサー率46% (14/30)
こんなのでいいのでしょうか? @get = split('&', $ENV{'QUERY_STRING'}); foreach $keyvalue (@get) { ($key, $value) = split('=', $keyvalue); ここで、$key、$valueの判定と、処理 $data[$key] = $value; } これが終わると、%data 連想配列に、getのデータが入っていますので、外で使えます。 後、正規表現ですが、 $key の判定は、/^data[1-3]$/ でいいと思います。 数字4個でしたら、 /^\d{4}$/ 4文字以上、6文字以下の大文字の繰り返しでしたら /^[A-Z]{4,6}$/ って、書けます。