2010-08-31 14 views
25

Dla PHP, co jest najlepszym walidacji e-mail przy użyciu preg, NIEereg bo to przestarzałe/usunięte.PHP Walidacja email

I nie trzeba sprawdzić, czy strona istnieje (to nie tak maksymalne bezpieczeństwo).

Znalazłem wiele sposobów z ereg, ale one (oczywiście) nie są dobrą praktyką.

Odpowiedz

78

Proponuję użyć FILTER_VALIDATE_EMAIL filtr:

if (filter_var($email, FILTER_VALIDATE_EMAIL)) { 
    //valid 
} 

Można również użyć its regular expression bezpośrednio:

"/^(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){255,})(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){65,}@)(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22))(?:\\.(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-[a-z0-9]+)*\\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-[a-z0-9]+)*)|(?:\\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\\]))$/iD" 

Ale w takim razie, jeśli błąd występuje w wyrażeniu regularnym, ty” Będę musiał zaktualizować twój program zamiast tylko aktualizować PHP.

+1

Należy pamiętać, że e-mail może również zawierać następujące znaki: ' '/ *'. Ta walidacja nie sprawia, że ​​DB jest bezpieczne. –

+0

filter_var() jest dla mnie nowością. Czy FILTER_VALIDATE_EMAIL jest dobry? – Marwelln

+0

+1 dla kodu źródłowego. świetny –

3

Jeśli nie chcesz użyć numeru very very long regular expressions, możesz użyć prawidłowych adresów e-mail, które nie są uwzględnione (pomyśl o Unicode). Również fałszywe adresy e-mail będą traktowane jako ważne, więc jaki jest sens sprawdzania, czy możesz po prostu napisać [email protected] i uciec?

Najlepszym sposobem sprawdzania poprawności adresów e-mail jest wysłanie e-maila z potwierdzeniem z linkiem do kliknięcia. Będzie działać tylko wtedy, gdy adres e-mail jest prawidłowy: łatwy i nie trzeba używać wyrażenia regularnego.

+0

Po prostu tak jak powiedziałem, to nie jest jak maksymalne bezpieczeństwo. –

+4

Rozsądny Deweloper zawsze będzie sprawdzał dany adres pod względem ważności PRZED wysłaniem e-maila na "ciąg". To nie jest argument. Ale i tak powinno być zrobione Doupble-opt-in - co nie było problemem. –

+0

@Jan .: A co jeśli mój e-mail to àèìòù@mydomain.com, a kontrola prewencyjna uniemożliwia mi zarejestrowanie się w witrynie? Po prostu wyślij e-mail z potwierdzeniem i gotowe, nie musisz sprawdzać poprawności wcześniej i ryzykować zablokowaniem prawidłowych adresów e-mail. – nico

0
function check_email($check) { 
$expression = "/^[a-zA-Z0-9._-][email protected][a-zA-Z0-9._-]+\.([a-zA-Z]{2,4})$/"; 
if (preg_match($expression, $check)) { 
    return true; 
} else { 
    return false; 
} 
} 

nazywają go w if() jako warunek poniżej przykład:

if(!check_email($_REQUEST['ContactEmail'])){ 
    $register_error ="Enter the correct email address!<br />"; 
    $reg_error=1; 
} 
+0

może ktoś mi powiedzieć, jaki jest problem w tym kodzie bcz osoby w dół głosowania. Działa dobrze. –

+0

To nie ja głosowałem, ale .... to nie jest poprawne, aby poprawnie filtrować adresy e-mail, poprawne i pełne wyrażenie można znaleźć tutaj: http://www.ex-parrot.com/~ pdw/Mail-RFC822-Address.html Po drugie użycie PHP wbudowanego w FILTER_VALIDATE_EMAIL byłoby najlepszym/najlepszym sposobem na filtrowanie adresu e-mail – twigg