Mam tę funkcję do sprawdzania poprawności adresów e-mail:
function validateEMAIL($EMAIL) {
$v = "/[a-zA-Z0-9_-.+]+@[a-zA-Z0-9-]+.[a-zA-Z]+/";
return (bool)preg_match($v, $EMAIL);
}
Czy można sprawdzić, czy adres e-mail jest prawidłowy, czy nie?
php
regex
email
email-validation
Cameron
źródło
źródło
validateEmail
byłoby słuszne, a także przemijające$email
, a nie$EMAIL
.Odpowiedzi:
Najłatwiejszym i najbezpieczniejszym sposobem sprawdzenia, czy adres e-mail jest poprawnie sformułowany, jest skorzystanie z
filter_var()
funkcji:Dodatkowo możesz sprawdzić, czy domena definiuje
MX
rekord: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: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”.
źródło
filter_var
pozostanie w tyle przez długi czas, nawet jeśli teraz to zmienią (opublikowałem raport o błędzie).Możesz do tego użyć filter_var .
źródło
Z mojego doświadczenia wynika, że
regex
rozwiązania mają zbyt wiele fałszywych wyników pozytywnych, afilter_var()
rozwiązania mają fałszywe negatywy (szczególnie w przypadku wszystkich nowszych TLD ).Zamiast tego lepiej jest upewnić się, że adres zawiera wszystkie wymagane części adresu e-mail (użytkownik, symbol „@” i domena), a następnie sprawdzić, czy sama domena istnieje.
Nie ma możliwości ustalenia (po stronie serwera), czy istnieje użytkownik poczty e-mail dla domeny zewnętrznej.
Oto metoda, którą stworzyłem w klasie Utility:
źródło
stristr
nie uda się uzyskać domeny, jeśli istnieje wiele znaków @. Lepiejexplode('@',$email)
i sprawdź tosizeof($array)==2
checkdnsrr()
zwróciłaby wartość false, gdyby w domenie był znak @.Myślę, że lepiej byłoby użyć wbudowanych filtrów PHP - w tym konkretnym przypadku:
Może zwrócić wartość prawda lub fałsz, jeśli zostanie dostarczony z
FILTER_VALIDATE_EMAIL
parametrem.źródło
Spowoduje to nie tylko sprawdzenie poprawności twojego e-maila, ale także odkażenie go w przypadku nieoczekiwanych znaków:
źródło
Odpowiedzieli na to pytanie w „głównym pytaniu” na temat weryfikacji wiadomości e-mail https://stackoverflow.com/a/41129750/1848217
Więc po prostu sprawdź @, podpowiedź użytkownikowi na interfejsie i wyślij e-maile weryfikacyjne na podany adres.
źródło
@
, ale tak naprawdę nie sprawdza, czy jest poprawne według któregokolwiek z RFC, które rządzą pocztą e-mail. To również nie działa jak napisano. Uruchomiłem go przez regex101.com i nie udało się dopasować prawidłowych adresów/^[^@]+@[^@+]$/
do/^[^@]+@[^@]+$/
filter_var
metody? Nie rozwiązuje też problemu przyjmowania źle sformatowanych adresów. Twój regex z przyjemnością zaakceptujejoe@domain
jako prawidłowy adres e-mail, jeśli nie jestfilter_var($email, FILTER_VALIDATE_EMAIL, $newOptions)
. Ale masz starą funkcję na serwerze, w niektórych przypadkach nie można zaktualizować. I stracisz klientów z kilkoma nowymi ważnymi e-mailami. Po raz kolejny zauważam, że nie wszystkie serwery obsługujące pocztę elektroniczną działają ściśle zgodnie ze wspólnym i nowoczesnym standardem adresów e-mail.Jeśli chcesz sprawdzić, czy podana domena z adresu e-mail jest poprawna, użyj czegoś takiego:
Jest to przydatny sposób na filtrowanie wielu nieprawidłowych adresów e-mail wraz ze standardową weryfikacją adresu e-mail, ponieważ prawidłowy format wiadomości e-mail nie oznacza prawidłowego adresu e-mail .
Zauważ, że
idn_to_ascii()
funkcja (lub jego siostrzana funkcjaidn_to_utf8()
) może nie być dostępna w twojej instalacji PHP, wymaga ona rozszerzenia PECL intl> = 1.0.2 i PECL idn> = 0.1.Należy również pamiętać, że IPv4 lub IPv6 jako część domeny w wiadomości e-mail (na przykład
user@[IPv6:2001:db8::1]
) nie mogą zostać zweryfikowane, mogą to być tylko hosty o nazwie .Zobacz więcej tutaj .
źródło
Po przeczytaniu tutaj odpowiedzi otrzymałem:
źródło
Jeśli jesteś po prostu patrząc na rzeczywiste regex, która pozwala na różnych kropek i kresek, podkreślenia, to w następujący sposób:
[a-zA-z0-9.-]+\@[a-zA-z0-9.-]+.[a-zA-Z]+
. Pozwoli to na dość głupio wyglądającą wiadomość e-mail, taką jaktom_anderson.1-neo@my-mail_matrix.com
walidacja.źródło
W dzisiejszych czasach, jeśli używasz formularza HTML5
type=email
, jesteś już w 80% bezpieczny, ponieważ silniki przeglądarek mają swój własny walidator. Aby go uzupełnić, dodaj ten wyrażenie regularne do swojegopreg_match_all()
i zaneguj go:Znajdź regex używany przez formularze HTML5 do sprawdzania poprawności
https://regex101.com/r/mPEKmy/1
źródło