入力チェック
HTMLフォームから入力されたデータをチェックし、不備があればエラーメッセージを表示させてみましょう。
入力内容に問題がなければ、完了メッセージを表示します。
サンプル
今回もいつものように、3種類の入力フォームを用意しました。
Shift_Jisコードの入力フォーム。
EUCコードの入力フォーム。
UTF-8コードの入力フォーム。
実際にデータを入力して試してみてください。
氏名とお問い合わせ内容のチェックは、何らかの文字が入力されたかどうかを調べるだけですが…。
メールアドレスに関しては、その書式がある程度決まっているので、そのあたりも調べています。
すべての入力内容に問題がなければ、完了メッセージを出します。
<戻る>
ダウンロード
サンプルプログラムをダウンロードするにはここをクリックします。
ZIP形式で圧縮されているので解凍作業が必要です。
改行コードはWindows形式です。
文字コードは、Perl/CGIプログラム本体および各種設定ファイル、シフトジスバージョンの入力フォーム、thanks.htmlはShift_Jisコードです。
もちろんEUCバージョンの入力フォームはEUC、UTF-8バージョンの入力フォームはUTF-8コードになっています。
解説
入力内容を取得することと、各種メッセージの読み込みについては、それぞれのページを参照してください。
ここでは今までの内容にプラスして、各種入力データのチェックと、HTML形式でのデータ出力をしています。
入力チェック
「氏名」「メールアドレス」と「お問い合わせ内容」入力欄に何らかの文字が入力されたかどうかの簡単なチェックは、メイン処理部分でやっています。
メールアドレスの書式チェックは、「mail.pl」内のcheck関数が担当しています。
check関数
check関数は、ある程度決まっているメールアドレスの書き方を手がかりに、与えられた文字列をチェックします。
引数にはチェックしたいメールアドレスを渡します。
問題なければ1を返し、そうでなければ何も返しません。
この関数内では難しいことは何もしていないので、ざっと見ていただければ理解できると思います。
ねんのため、簡単にこの関数の流れつまり、メールアドレスのチェックプロセスを見ていきましょう。
使用文字チェック
まずは、メールアドレスに使用されている文字をチェックします。
「if($email =~ /[^a-zA-Z0-9\@\.\-\_]/) {return;}」という部分がそうですね。
メールアドレスには、半角英数と一部の記号「@_-.」以外は使用できません。
もしそれ以外の文字が使用されていた場合は、if文が成立しチェック終了です。
「@」のチェック
「@」の数をチェックします。
my $atCount = 0;
while($email =~ /\@/g) {
$atCount++;
}
if($atCount != 1) {return;}
当然ですが、メールアドレスには「@」は1つだけです。
「@」が2つ以上あった場合や、ひとつもなかった場合には、if文が成立しチェック終了です。
アカウントとドメインのチェック
メールアドレスは、「アカウント名@ドメイン名」という形になっています。
なので今度は、アカウント名とドメイン名をそれぞれチェックしていきます。
まずは、アカウント名とドメイン名が存在しているかをチェックします。
my($acnt, $domain) = split(/\@/, $email);
unless ($acnt) {return;}
unless ($domain) {return;}
メールアドレスを「@」を境に分断し、アカウント名とドメイン名が存在しているかどうかを調べます。
もし存在していなければ、unlessが成立し、チェック終了です。
ドメイン名の「.」数チェック
ドメイン名の「.」の数をチェックします。
my $dotCount = 0;
while($domain =~ /\./g) {
$dotCount++;
}
if($dotCount == 0) {return;}
ドメイン名には、必ず1つ以上「.」が存在します。
なので、「@」の数を数えたやり方と同じやり方で、ここでは「.」の数を数えています。
もし、「.」が1つもなかった場合には、if文が成立しチェック終了です。
ドメイン名の「.」位置チェック
ドメイン名の「.」のある場所をチェックします。
if($domain =~ /^\./) {return;}
if($domain =~ /\.$/) {return;}
if($domain =~ /\.\./) {return;}
1つ目のif文が、ドメイン名の頭に「.」がないかどうかのチェック。
2つ目のif文は、ドメイン名の末尾に「.」があるかどうかのチェック。
3つ目のif文は、ドメイン名の中に「.」が連続していないかのチェック。
ようするに、不自然な位置に「.」があればif文が成立しチェック終了です。
トップレベルドメインのチェック
ドメイン名の末尾、「jp」や「com」といった部分を、トップレベルドメインといいます。
今度はその部分をチェックします。
my @domainParts = split(/\./, $domain);
my $topLevelDomain = pop @domainParts;
if($topLevelDomain =~ /[^a-zA-Z]/) {return;}
ドメイン名を「.」を境に分解し、一番最後の部分であるトップレベルドメインを取り出します。
トップレベルドメインには、半角英字しか使われていないので、そこをチェックします。
チェック終了
これでメールアドレスの書式チェックは終了です。
ここまで来れば問題ないとみなし、「1」を返しこの関数終了です。
メッセージの表示
メッセージの表示には、「script.pl」のhtml関数を使っています。
引数には、ページタイトル、メッセージ内容、Backボタンを表示するかどうかのフラグを渡します。
あとは、普通にprint関数を使って、ひたすらHTMLタグとメッセージ内容を表示しています。
最後に、exit関数でプログラムの動きを止めるようにしています。
メイン処理
メイン処理では、「氏名」「メールアドレス」と「お問い合わせ内容」の入力チェックをしています。
みればわかると思うので、説明することは何もないのですが…。
氏名入力欄に入力された文字列は、「$param->{name}」。
メールアドレス入力欄に入力された文字列は「$param->{email}」。
お問い合わせ内容の文字列は、「$param->{message}」にそれぞれ代入されています。
<戻る>