入力チェック

HTMLフォームから入力されたデータをチェックし、不備があればエラーメッセージを表示させてみましょう。

入力内容に問題がなければ、完了メッセージを表示します。

  1. サンプル
  2. ダウンロード
  3. 解説

サンプル

今回もいつものように、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}」にそれぞれ代入されています。

<戻る>