2009-06-15 16 views
9

可能性の重複:
What is the best regular expression for validating email addresses?メール正規表現

重複:What is the best regular expression for validating email addresses?

私は、これは一般的な質問ですけど、私はまだ偉大な正規表現を見つけることができないよう電子メールアドレスの検証時に使用する

私は実際にスペックを読んで自分のことを書く時間がありません。前に使用したことがあり、うまくいきましたか?私は本当に100%の仕様にマッチする気はしませんが、近いほど良いです。

+0

電子メールの正規表現についてはたくさんの質問があります。 http://stackoverflow.com/questions/508108/regex-for-email-validation-closed – Macarse

答えて

13

ここで私が使う機能です。それだけで正規表現によるメールアドレスを実行するよりも、もう少しし、これまでのところ、それは私が見つけた最も完全なソリューションです:

function validEmail($email, $skipDNS = false) 
{ 
    $isValid = true; 
    $atIndex = strrpos($email, "@"); 
    if (is_bool($atIndex) && !$atIndex) 
    { 
     $isValid = false; 
    } 
    else 
    { 
     $domain = substr($email, $atIndex+1); 
     $local = substr($email, 0, $atIndex); 
     $localLen = strlen($local); 
     $domainLen = strlen($domain); 
     if ($localLen < 1 || $localLen > 64) 
     { 
     // local part length exceeded 
     $isValid = false; 
     } 
     else if ($domainLen < 1 || $domainLen > 255) 
     { 
     // domain part length exceeded 
     $isValid = false; 
     } 
     else if ($local[0] == '.' || $local[$localLen-1] == '.') 
     { 
     // local part starts or ends with '.' 
     $isValid = false; 
     } 
     else if (preg_match('/\\.\\./', $local)) 
     { 
     // local part has two consecutive dots 
     $isValid = false; 
     } 
     else if (!preg_match('/^[A-Za-z0-9\\-\\.]+$/', $domain)) 
     { 
     // character not valid in domain part 
     $isValid = false; 
     } 
     else if (preg_match('/\\.\\./', $domain)) 
     { 
     // domain part has two consecutive dots 
     $isValid = false; 
     } 
     else if (!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/', str_replace("\\\\","",$local))) 
     { 
     // character not valid in local part unless 
     // local part is quoted 
     if (!preg_match('/^"(\\\\"|[^"])+"$/', str_replace("\\\\","",$local))) 
     { 
      $isValid = false; 
     } 
     } 

     if(!$skipDNS) 
     { 
      if ($isValid && !(checkdnsrr($domain,"MX") || checkdnsrr($domain,"A"))) 
      { 
      // domain not found in DNS 
      $isValid = false; 
      } 
     } 
    } 
    return $isValid; 
} 

機能を持っているがオプション$ skipDNSに設定することができ、引数ホースのMXレコードを検証したくない場合はTRUEを返します。それ以外の場合、関数は提供された電子メールアドレスが実際の電子メールサーバーに実際にマップされていることを検証しようとします。

ほとんどのRegEx電子メールの検証手法ではほとんどの電子メールアドレスが検証されますが、慎重に作成された無効なアドレスや最悪のものが許可される可能性が高いことに注意してください。詳細は、Internet Message Formats RFCを参照してください。これは、電子メールアドレスに許可されている形式を示しています。

+0

DNSレコードをチェックして...素晴らしいアプローチ! –

+0

これは実際にはREDOSにいくらか脆弱です。 https://github.com/johnhenry/valid-email/issues/4で、関連する攻撃を参照してください。 –

12
^([0-9a-zA-Z]([-\.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$ 

これは、書き込みを支援し、あなたがそれを持っていますが、うまくいけば、その有用かどうかわからない、式をチェックするための素晴らしいツールです。

Expresso

+2

この正規表現は、[このフォローアップの質問]で示されるように、壊滅的なバックトラックを引き起こすための確実な方法です(http: //stackoverflow.com/q/13087755/20670)。 –

+1

はこれを使用しないでください - 参照:http://stackoverflow.com/questions/13087755/can-anyone-tell-me-why-this-c-sharp-email-validation-regular-expression-regex –

+0

'素晴らしいツール'壊滅的なバックトラックについては警告しない。 RegexBuddyがしているかどうかはわかりませんが、それは私の選択肢です。 –