2009-06-15 11 views
9

Powiel możliwe:
What is the best regular expression for validating email addresses?email wyrażenie regularne

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

wiem, że to typowe pytanie, ale wciąż nie może się znaleźć wielką wyrażenie regularne używać podczas sprawdzania poprawności adresów e-mail.

Nie mam czasu, aby przeczytać specyfikację i napisać własną. Co wykorzystałeś wcześniej i czy to działa dobrze? Nie zależy mi na 100% dopasowania do specyfikacji, ale im bliżej, tym lepiej.

+0

Istnieje wiele pytań na temat regex e-mail. http://stackoverflow.com/questions/508108/regex-for-email-validation-closed – Macarse

Odpowiedz

13

Oto funkcja, która używam. Robi się trochę więcej niż tylko uruchomić adres e-mail za pośrednictwem regex, ale jak dotąd jest to najbardziej kompletne rozwiązanie, które znalazłem:

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; 
} 

Funkcja posiada opcjonalnie $ skipDNS argumentem, które mogą być ustawione TRUE, jeśli nie chcesz sprawdzać poprawności rekordów MX dla hos. W przeciwnym razie funkcja spróbuje sprawdzić, czy podany adres e-mail rzeczywiście jest mapowany na prawdziwy serwer e-mail.

Warto zauważyć, że większość technik sprawdzania poprawności e-mailem RegEx potwierdzi większość adresów e-mail, ale najprawdopodobniej pozwolą one na starannie spreparowane nieprawidłowe adresy lub najgorsze ... zawierują niektóre bardziej niejasne, ale ważne adresy e-mail. Aby uzyskać więcej informacji, możesz zapoznać się z Internet Message Formats RFC, który opisuje dozwolony format adresów e-mail.

+0

Sprawdzanie rekordów DNS ... ładne podejście! –

+0

To jest również w pewnym stopniu podatne na REDOS. Zobacz pokrewny exploit tutaj: 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})$ 

To jest niesamowite narzędzie do pisania i sprawdzania ekspresji, nie wiem, czy masz go, ale miejmy nadzieję, że jest pomocne.

Expresso

+2

To regex to pewny sposób wywołania katastroficznego powrotu, o czym świadczy [to kolejne pytanie] (http: //stackoverflow.com/q/13087755/20670). –

+1

Nie używaj tego - patrz: http://stackoverflow.com/questions/13087755/can-anyone-tell-me-why-this-c-sharp-email-validation-regular-expression-regex –

+0

'Niesamowite narzędzie 'nie ostrzega o katastroficznym cofaniu. Nie jestem pewien, czy RegexBuddy ma, ale to jest moje narzędzie z wyboru. –