Najłatwiejszym i najbezpieczniejszym sposobem sprawdzenia, czy adres e-mail jest poprawnie sformułowany, jest skorzystanie z filter_var()
funkcji:
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
// invalid emailaddress
}
Dodatkowo możesz sprawdzić, czy domena definiuje MX
rekord:
if (!checkdnsrr($domain, 'MX')) {
// domain is not valid
}
Ale to wciąż nie gwarantuje, że poczta istnieje. Jedynym sposobem, aby się tego dowiedzieć, jest wysłanie wiadomości potwierdzającej.
Teraz, gdy masz łatwą odpowiedź, możesz przeczytać dalej o sprawdzaniu poprawności adresu e-mail, jeśli chcesz się nauczyć lub w inny sposób po prostu skorzystać z szybkiej odpowiedzi i przejść dalej. Bez urazy.
Próba sprawdzenia poprawności adresu e-mail przy użyciu wyrażenia regularnego jest „niemożliwym” zadaniem. Chciałbym posunąć się nawet do stwierdzenia, że ten regex, który stworzyłeś, jest bezużyteczny. Istnieją trzy rfc dotyczące adresów e-mail i napisania wyrażenia regularnego w celu złapania niewłaściwych adresów e-mail, a jednocześnie brak fałszywych alarmów jest czymś, czego żaden śmiertelny nie może zrobić. Sprawdź tę listę pod kątem testów (zarówno nieudanych, jak i udanych) wyrażenia regularnego używanego przez filter_var()
funkcję PHP .
Nawet wbudowane funkcje PHP, klienci poczty e-mail lub serwery nie działają poprawnie. Nadal w większości przypadków filter_var
jest najlepszą opcją.
Jeśli chcesz wiedzieć, jakiego wzorca wyrażenia regularnego używa PHP (obecnie) do sprawdzania adresów e-mail, zobacz źródło PHP .
Jeśli chcesz dowiedzieć się więcej o adresach e-mail, sugeruję, abyś zaczął czytać specyfikacje, ale muszę cię ostrzec, że nie jest to łatwe do odczytania pod żadnym względem:
Zauważ, że filter_var()
jak już wspomniano, dostępne tylko od PHP 5.2. Jeśli chcesz, aby działał ze starszymi wersjami PHP, możesz użyć wyrażenia regularnego używanego w PHP:
<?php
$pattern = '/^(?!(?:(?:\\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';
$emailaddress = 'test@gmail.com';
if (preg_match($pattern, $emailaddress) === 1) {
// emailaddress is valid
}
PS Uwaga na temat wzorca wyrażeń regularnych używanych powyżej (ze źródła PHP). Wygląda na to, że jest trochę praw autorskich do Michaela Rushtona . Jak stwierdzono: „Zachowaj swobodę w używaniu i rozpowszechnianiu tego kodu. Ale zachowaj tę informację o prawach autorskich”.
validateEmail
byłoby słuszne, a także przemijające$email
, a nie$EMAIL
.