Регулярное выражение для проверки E-mail
Немного банально, но все-таки, напишу кратко заметку (если Вы читаете, то уже написал) посвященную регулярному выражению для проверки E-mail адреса, введенного пользователем в какую-либо форму, какого-либо приложения.
Если частью вашей профессиональной деятельности является поддержка такого приложения, то не хотелось бы, чтобы пользователи обращались к Вам с жалобами на то, что введенные ими E-mail адреса почтовых ящиков, которыми они пользуются, приложение не принимает. Так же нужно чтобы одобрены были только адреса верного формата.
Интернет содержит много статей, авторы которых предлагают использовать для этих целей некоторые регулярные выражения, пользуясь которыми, такие адреса как: user@i.ua, samara@lada.moe.auto.ua, petr@tut-tut.ru, будут считаться недопустимыми (короткое доменное имя, доменное имя четвертого уровня, доменное имя с дефисом). Либо напротив — будут приняты адреса типа mitya@dom-.ru, valya.@mad.ru (доменное имя не может содержать дефис, непосредственно перед точкой, имя ящика не может заканчиваться точкой). В обоих случаях эти проверки работают неправильно.
E-mail адрес состоит из имени ящика, собаки, и доменного имени. Имя ящика будем считать неограниченной длинны. Оно должно содержать только латинские буквы, цифры, точку, знак подчеркивания и минус (дефис) , причем начинаться и заканчиваться должно латинской буквой или цифрой. Доменное имя состоит из частей разделенных точками, причем частей должно быть не меньше двух, между двумя частями стоит ровно одна точка. Каждая часть состоит только из латинских букв, цифр, и символа “-” (минус), причем начинаться и заканчиваться оно должно латинской буквой или цифрой. Последняя часть состоит из 2-4 латинских букв. Имя домена также будем считать неограниченной длинны.
Регулярное выражение:
/^[a-z0-9](?:[a-z0-9_\.-]*[a-z0-9])*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])*\.)+[a-z]{2,4}$/i
Или так, если хотите:
/^[a-z\d](?:[\w\.-]*[a-z\d])*@(?:[a-z\d](?:[a-z\d-]*[a-z\d])*\.)+[a-z]{2,4}$/i
Пример кода на PHP:
/* регулярное выражение */
$pattern = "/^[a-z0-9](?:[a-z0-9_\.-]*[a-z0-9])*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])*\.)+[a-z]{2,4}$/i";
if(preg_match($pattern, 'test@mail.ru'))
echo 'test@mail.ru принят <br/>';
else echo 'test@mail.ru не принят <br/>';
if(preg_match($pattern, 'user@i.ua'))
echo 'user@i.ua принят <br/>';
else echo 'user@i.ua не принят <br/>';
if(preg_match($pattern, 'samara@lada.moe.auto.ua'))
echo 'samara@lada.moe.auto.ua принят <br/>';
else echo 'samara@lada.moe.auto.ua не принят <br/>';
if(preg_match($pattern, 'petr@tut-tut.ru'))
echo 'petr@tut-tut.ru принят <br/>';
else echo 'petr@tut-tut.ru не принят <br/>';
if(preg_match($pattern, 'mitya@dom-.ru'))
echo 'mitya@dom-.ru принят <br/>';
else echo 'mitya@dom-.ru не принят <br/>';
if(preg_match($pattern, 'valya.@mad.ru'))
echo 'valya.@mad.ru принят <br/>';
else echo 'valya.@mad.ru не принят <br/>';
?>
Выводится на экран:
user@i.ua принят
samara@lada.moe.auto.ua принят
petr@tut-tut.ru принят
mitya@dom-.ru не принят
valya.@mad.ru не принят
