проверка e-mail на корректность

yok

Новичок
проверка e-mail на корректность

Всем ЗДРАСТЕ.
Такое дело, задача проверить email на корректность.
Полазил по форумам, сам проверял регистрироваться, что запрещают там и прочее, и что понял, что конкретно то не особо определена эта задача.
Ну вот например
var_dump(filter_var('[email protected]', FILTER_VALIDATE_EMAIL));
как вы сами видите пхп пропускает такой адрес.
Конечно может особо не стоит заморачиваться, есть собачка, точка. Даже не знаю.
При проверке регулярными выражениями \w пропускает _ и получается что в начале слова может быть _
И нигде о таких ошибках не пишется. Даже не знаю, стоит ли так заморачиваться, просто решил разобраться, раз уж пишу сценарий, а тут вот сколько. И нигде удовлетворяющего ответа не нашел.

Пока вот так
/^[a-z0-9][-.\w]+[a-z0-9]@[a-zA-Z0-9][-\w]+(\.[a-z0-9]\w+)?\.[a-z]{2,7}$/i
Кстати скажи такое может лучше и оно в пхп работает, проверил работает
[a-z0-9][-.\w]+[a-z0-9]@[a-zA-Z0-9][-\w]+(?:\.[a-z0-9]\w+)?\.[a-z]{2,7}$/i
Это же так понимаю лучше - ?:

Хотелось бы услышать замечания.
 

dimagolov

Новичок
домены первого уровня надо еще проверять по словарю. словарь на http://iana.org/domains/root/db/
 

yok

Новичок
чем адрес [email protected] принципиально хуже адреса
[email protected]?

а разве такой адрес где-то можно зарегистрировать.? Конечно опасности он не несет, но все же преследуется определенная корректность.

здесь http://iana.org/domains/root/db/
видно что максимально до 6 символов .museum .travel
и только /\.[a-z]{2,6}$/i что я и написал только до 7
если не описать каждый, что думаю уже лишне.

Спасибо за инфо.

-~{}~ 09.10.09 16:00:

еще один момент \w пропустит русские буквы.
 

zerkms

TDD infected
Команда форума
какой смысл писать очень сложные регулярки?
вам важнее соответствие rfc (которого вы никогда не достигнете) или то, что этот ящик существует и принадлежит конкретному человеку?
 

Фанат

oncle terrible
Команда форума
yok
какая разница, что я напишу в поле емейл -
[email protected]
или
bob@заведомо не существующий домен qwefwerg.com
?
 

dimagolov

Новичок
*****, а почему "не существующий"? можно и домен существующий (домен как раз легко проверить), и даже мыло живое (e.g. postmaster на любом домене). Это все не гарантия того, что мыло того, кто региться. Тут надо определиться чего этой проверкой хотите достичь, например проверить опечатки или непреднамеренные юзерские ошибки. На большее рассчитывать нет смысла, так как обмануть всегда можно будет, если не слать код активации/пароль на мыло.
 

dimagolov

Новичок
тут куда продуктивнее, чем фильтрация мыла, продумать кто и как будет анализировать отлупы на посланные с сайта сообщения. потому что если регистрацию еще можно сделать без этого (e.g. килять не активированные аккаунты через неделю после создания), то потом, вполне живое при регистрации мыло, может стать мертвым (или у него может закончиться квота, быть деактивированным) и последующие отправки будут в пустоту.
 

yok

Новичок
какой смысл писать очень сложные регулярки?
вам важнее соответствие rfc (которого вы никогда не достигнете) или то, что этот ящик существует и принадлежит конкретному человеку?

В данном случае задача корректность e-mail
И слишком сложной регулярки не нужно.
if(preg_match("/^[a-z0-9][-._a-z]+[a-z0-9]@[a-z0-9][-_a-z]+[a-z0-9](?:\.[a-z0-9][-_a-z0-9]+[a-z0-9])?\.[a-z]{2,6}$/i",$mail,$matches)) {
Вот помоему и более ничего не надо.
имя пользователя должно с буквы начинаться и заканчиваться, в хосте тоже, домен первого уровня только буквы до 6, и \w здесь не возможно применять.
Просто я много видел, но и много ошибок.

Корректность это тоже важно, тем более регулярное то простое.

Как в фильме говорилось
из-за потерянного гвоздя потеряли подкову, изза подковы потеряли коня, изза коня не доставили сообщение изза сообщения проиграли войну.

Во всяком случае корректность мыла проверена, и все определено, если еще есть корректировки пожалуйста пишите.

Спасибо за рассуждения.

-~{}~ 12.10.09 13:54:

А еще точнее
if(preg_match("/^[a-z0-9](?:[-._a-z]+[a-z0-9])?@[a-z0-9][-_a-z]+[a-z0-9](?:\.[a-z0-9][-_a-z0-9]+[a-z0-9])?\.[a-z]{2,6}$/i",$mail,$matches)) {

если есть еще улучшения или подходы, взгляды, пожалуйста пишите.

Спасибо.
 
Сверху