[PHP]メールアドレスのチェック関数

Read More

PHPです。


昨日、とあるシステムでメールが送信できていないアドレスがあることに気が付いた。

なんでかなーと原因を探っていると、
アドレスの先頭に'-'(ハイフン)を使われていたからだった。


メール仕様(RFC)を少し調べた
・アドレスの先頭に'-'(ハイフン)は使えない
・アドレスの先頭に'.'(ドット)は使えない
・アドレスの@の直前に'.'は使えない
・アドレスに'.'を2回連続で使えない



うーん、知りませんでした。

ってことでpreg_match()と正規表現を使ってメールアドレスのチェックをしてみた。

--
改良したメールチェック関数
<?php
// 失敗時はfalseを返却
function isMail($sTar) {
  $chk=true;

  // 総文字数チェック
  if($chk) {
    $chk = (count($sTar)<=256)?true:false;
  }// end if

  // 全体形式チェック
  if($chk) {
    $chk = preg_match('/^([a-zA-Z0-9_\.\-]+)[@]([a-zA-Z0-9_\-]+)[\.]([a-zA-Z0-9_\.\-]+)$/u', $sTar, $match);
  }// end if

  // ローカル部の先頭文字列の'-'(ハイフン)、'.'(カンマ)
  if($chk) {
    $chk = preg_match('/^([^\-\.])/u', $match['1']);
  }// end if

  // ローカル部の後方文字の最後が'.'
  if($chk) {
    $chk = preg_match('/([^\.])$/u', $match['1']);
  }// end if

  // 文字列中に'.'が2回連続
  if($chk) {
    $chk = !preg_match('/([\.]{2})/u', $match['1']);
  }// end if

  return $chk;
}// end function
?>



他にも+記号が使える仕様とかあったけど、
許可できるようにしたいなら全体形式に足せばいい。

今回はやらない。


あとpreg_match()の正規表現なんだけど、1行で全部のチェックを済まそうとしても不可能です(たぶん)

そして仮にできたとしてもそれはとても読みにくいコードになるでしょう。そうすると保守がめんどくさい。

先述したようにばらばらにチェックをしておけば読みやすいので変更があっても楽に対応できちゃう!
ってのが俺の考え。