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

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

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

メールアドレスの書き方は、RFC 2282 Internet Message Format和訳】に定義されている。
しかし、これを定義通りに解釈すると URL より複雑になってしまう。そこで、実用上差し支えない程度に簡略化し、正規表現で表したのが下記である。

/[0-9a-z!#\$%\&'\*\+\/\=\?\^\|\-\{\}\.]+@[0-9a-z!#\$%\&'\*\+\/\=\?\^\|\-\{\}\.]+/

サンプル・プログラム

今回使った正規表現

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

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

メールアドレスかどうか検査する処理は、ユーザー定義関数 is_emailadr として独立させた。この中で関数  preg_match  を使ってマッチングさせている。
あとは、おまけの処理である。

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

0084: /**
0085:  * メールアドレスかどうか検査する
0086:  * @param string $email 検査するメールアドレス
0087:  * @return bool TRUE/FALSE
0088: */
0089: function is_emailadr($email) {
0090:     $pat = "/[0-9a-z!#\$%\&'\*\+\/\=\?\^\|\-\{\}\.]+@[0-9a-z!#\$%\&'\*\+\/\=\?\^\|\-\{\}\.]+/";      //メールアドレスを表す正規表現
0091: 
0092:     return preg_match($pat$email);
0093: }

参考サイト

(この項おわり)
header