正規表現でメールアドレスかどうかチェックする

(1/1)
正規表現は、入力値を検査するときにも利用できる。
Webプログラムでは、悪意のあるユーザーが XSS (クロスサイトスクリプティング)SQLインジェクション を仕掛けてくることがある。その対策として、入力値チェックは必要不可欠だ。
今回は、入力された文字列がメールアドレスかどうかチェックするプログラムを紹介する。

(2022年4月23日)マッチングパターンを定数RFC2282に定義

目次

サンプル・プログラムの実行例

正規表現で年月日を分解する

サンプル・プログラム

圧縮ファイルの内容
checkemail.phpサンプル・プログラム本体。

メールアドレスで使える文字

メールアドレスの書き方は、RFC 2282 Internet Message Format和訳】に定義されている。
しかし、これを定義通りに解釈するとURLより複雑になってしまう。そこで、実用上差し支えない程度に簡略化し、正規表現で表したのが下記である。
/^[0-9a-z\!\#\$\%\&\'\*\/\=\?\^\_\+\-\`\{\\}\~\.]+$/i

今回使った正規表現

?
直前1文字の0または1回の繰り返し。
[...]
文字クラス。
この中に記述された文字の並びのうちの1文字を表す。
-
文字の範囲指定。
a-z はアルファベット小文字すべてに、A-Zはアルファベット大文字すべてに、0-9は数字すべてにマッチする。
+
直前1文字の1回以上の繰り返し。
ここでは、文字クラス[...]に記述された文字、いずれかの1回以上の繰り返し――すなわち、URL 文字列にマッチすることになる。
\
エスケープ。
この直後の1文字自身を指す。
直後の1文字が正規表現の特殊文字(メタキャラクタ)である場合に用いる。

サンプル・プログラムの解説

0118: /**
0119:  * メールアドレスかどうか検査する
0120:  * @param   string $email 検査するメールアドレス
0121:  * @return  bool TRUE/FALSE
0122: */
0123: function is_emailadr($email) {
0124:     //ホスト名を分離
0125:     $arr = preg_split('/@/', $email);
0126:     if (count($arr) == 2) {
0127:         $res = preg_match(RFC2282$arr[0]) > 0 ? TRUE : FALSE;
0128:     } else {
0129:         $res = FALSE;
0130:     }
0131: 
0132:     return $res;
0133: }

メールアドレスかどうか検査する処理は、ユーザー定義関数 is_emailadr として独立させた。まず、ホスト名を分離し、メールアドレス部分に対し関数  preg_match  を使ってマッチングさせている。

このプログラムは、メールアドレスの形式が正しいかどうかを検査するだけである。それが存在するかどうかまでは検査していない。
PHPで正しいメールアドレスかどうか調べる」では、より厳密な方法で検査を行うプログラムを紹介している。

参考サイト

(この項おわり)
header