CGI-BBS > CGI > Perl > 正規表現の使い方


カレッヂ
カレッヂ


質問者 Octo  投稿日 7/4(水) 18:48:29
入力されたメールアドレスのチェックとして下記のスクリプトを
設定したところ、正常なアドレスを入力してもこの「アドレスの
入力が不正です」のメッセージが出てしまいます。

elsif ($FORM{'email'} !~ /^[a-zA-Z0-9].@.\..[a-zA-Z0-9]$/)
   {$errormsg = "E-Mailアドレスの入力が不正です";
    &error;}

正常なアドレスの条件として入れたかったのは
1)1文字目が数字または文字であること
2)途中に半角の@があり、1文字目と@の間に1文字以上が存在すること
3)@より後ろに半角のドットがあり、@とドットの間に1文字以上が存在すること
4)ドットより後ろに1文字以上存在すること
5)最後の文字は数字または文字であること
・・・です。

このスクリプトでいいのではないかと思ったのですが、
何がおかしいのでしょうか。

なお、$FORM{'email'} の値が空白であった場合はこれより前の部分で
別のエラーが出るようになっていますので、
変数名の設定がおかしい・・・ということではないと思います。

よろしくお願いします。

回答者 しあわせのツボ  [削除]  投稿日 7/4(水) 20:28:11
@が変数展開されているのかもしれません。\@とエスケープするとどうですか?

ちなみに、同様の処理をレスキューさんは
$FORM{'email'} !~ /\b[-\w.]+@[-\w.]+\.[-\w]+\b/
のようにしています。これをお借りしてしまうのが最も確実でしょう。
回答者 あけび  [削除]  投稿日 7/4(水) 23:34:28
どこがおかしいか、という話に的を絞るとすれば、
「1文字以上」のつもりで使っていらっしゃる「.」は、
「任意の1文字」ですので、
例えば 1a@a.a1 のように、
「英数字」「任意の1文字」「@」「任意の1文字」「.」「任意の1文字」「英数字」
の並びしか通らなくなります。
「1文字以上」を条件としたいなら、その場合の正規表現は「.+」となりますので、
$FORM{'email'} !~ /^[a-zA-Z0-9].+@.+\..+[a-zA-Z0-9]$/
となります。

また、ご自分で組むことにこだわるのでなければ、
しあわせのツボさんもおっしゃっているように
すでに実績のあるスクリプトの同様の処理を使わせてもらうほうが
簡単かと思います。
質問者 Octo  [削除]  投稿日 7/5(木) 09:24:35
>どこがおかしいか、という話に的を絞るとすれば、
>「1文字以上」のつもりで使っていらっしゃる「.」は、
>「任意の1文字」ですので、

その通りでした!
前に作ったときは、「先頭の文字」「最後の文字」に関する制限を
つけなかった($FORM{'email'} !~ /.@.\../)のでドットでも
よかったのですが、今回はこれではいけませんね。
さっそくやってみます。

ありがとうございました。
質問者 Octo  [削除]  投稿日 7/5(木) 15:57:34
結局下記の形で対応しました。

elsif ($FORM{'email'} !~ /^\w.*@.+\..+\w$/)
   {$errormsg = "E-Mailアドレスの入力が不正です";
    &error;}

ご提示いただきましたスクリプトに関しては、
「\b」や「-」のように私の知らない表現が入っており
どうも使うのは気が引けたため、使いませんでした。

ご協力どうもありがとうございました。

このページは終了したので返信(回答)は書きこめません

Web裏技