Проверка почты регуляркой (M.a_И-л[email protected]_И-л.-_1)

JSergRu

..ιilliιlιiιliιllilιι..
Пока еще не нашел ни одной регулярки в просторах интернета, которая пропустит M.a_И-л[email protected]_И-л.-_1.
Почему именно такой адрес в качестве шаблона?
Уже есть: майл.рф по-русски.рф, почта.рф
Не за горами какой-нибудь Емайл.рф с предосавлением почтовых адресов, да и владельцы доменов РФ уже имеют адреса шаблона info@домен.рф, также уже испытывается http://пример.испытание/!
Итак, собственно вопрос: какой регуляркой одобрить такие адреса как:
инфо@домен2.домен1
инфо@домен2.домен1
инфо@домен-3.домен_2.домен1
I.N.ф_о-1@D_оме_n-3.Доm-ен_2.домен1
I.N.ф_о[email protected]
I.N.ф_о[email protected]


Вот моя регулярка, но она почему-то мне не очень нравится, мне кажется можно получше составить...
if (!preg_match("|^([a-zа-я0-9_\.\-]+)@([a-zа-я0-9_\.\-]+)|is", strtolower($emai)))
например:
if (!preg_match("#^([a-Zа-Я0-9\.\-]+)@([a-Zа-Я0-9\.\-]+$#)", "$emai"))
{неверно}else{верно}
PS возможно в этой теме появится первая регулярка для почтовых адресов, которая не будет вызывать нереканий даже у самых опытных программистов.
Есть ли на этом форуме достойные программисты, способные составить НЕ говнокод, решающий эту задачу?
 

Фанат

oncle terrible
Команда форума
У меня вызывает нарекание обращение к переменной. Переменные в РНР пишутся без кавычек. В кавычках пишутся строки.
 

JSergRu

..ιilliιlιiιliιllilιι..
Текущий вариант получается таким:
if (!preg_match("#^([a-Zа-Я0-9\.\-]+)@([a-Zа-Я0-9\.\-]+$#)", $email)){лож}else{правда}
Еще предложения? )
 

флоппик

promotor fidei
Команда форума
Партнер клуба
А еще, примеры 3-6 — невалидные почтовые адреса:
The domain name part of an email address has to conform to strict guidelines: it must match the requirements for a hostname, consisting of letters, digits, hyphens and dots. In addition, the domain part may be an IP address literal, surrounded by square braces, such as jsmith@[192.168.2.1]
 

JSergRu

..ιilliιlιiιliιllilιι..
Спасибо Флоппик за ссылку, к задаче добавляется адрес user@[IPv6:2001:db8:1ff::a0b:dbd0],
соответственно: I.N.ф_о[email protected] и I.N.ф_о[email protected] теряют смысл в задаче из-за "not compliant" и добавления нового условия )
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Спасибо Флоппик за ссылку, к задаче добавляется адрес user@[IPv6:2001:db8:1ff::a0b:dbd0]
PHP:
root@ux:~# php -r "var_dump(filter_var('user@[IPv6:2001:db8:1ff::a0b:dbd0]', FILTER_VALIDATE_EMAIL));"
string(34) "user@[IPv6:2001:db8:1ff::a0b:dbd0]"
root@ux:~#
 

JSergRu

..ιilliιlιiιliιllilιι..
PHP:
root@ux:~# php -r "var_dump(filter_var('user@[IPv6:2001:db8:1ff::a0b:dbd0]', FILTER_VALIDATE_EMAIL));"
string(34) "user@[IPv6:2001:db8:1ff::a0b:dbd0]"
root@ux:~#
var_dump(filter_var('info@домен.рф', FILTER_VALIDATE_EMAIL));
FALSE
var_dump(filter_var('I.N.ф_о-1@D_оме_n-3.Доm-ен_2.домен1', FILTER_VALIDATE_EMAIL));
FALSE

итог: функция не подходит
 

флоппик

promotor fidei
Команда форума
Партнер клуба
BTW, русские адреса нужно предварительно сконвертить в punycode:

PHP:
root@ux:~# apt-get install libidn11 libidn11-dev
root@ux:~# pecl install idn-beta
root@ux:~# echo "extension=idn.so" >> /etc/php5/conf.d/idn.ini

root@ux:~#  php -r "var_dump(filter_var(idn_to_ascii('инфо@домен2.домен1'), FILTER_VALIDATE_EMAIL));"
string(35) "[email protected]"
root@ux:~#
Ты бы это... теорию подучил сначала?
 

JSergRu

..ιilliιlιiιliιllilιι..
BTW, русские адреса нужно предварительно сконвертить в punycode:

PHP:
root@ux:~# apt-get install libidn11 libidn11-dev
root@ux:~# pecl install idn-beta
root@ux:~# echo "extension=idn.so" >> /etc/php5/conf.d/idn.ini

root@ux:~#  php -r "var_dump(filter_var(idn_to_ascii('инфо@домен2.домен1'), FILTER_VALIDATE_EMAIL));"
string(35) "[email protected]"
root@ux:~#
Ты бы это... теорию подучил сначала?
ммм...
интересно интересно...
у меня произошла попытка вызова неизвестной функции idn_to_ascii(), обидно, вопрос пока остается открытым, на каждом ли хостинге возможно будет вызвать эту ф.?
 

JSergRu

..ιilliιlιiιliιllilιι..
Однажды поднимал эту тему для возможности использовать регулярное выражение не только в php, но и в js и html5, поэтому приемлимым для меня стал ответ "Mail::RFC822::Address: regexp-based address validation", однако время расставило все по своим местам, в действительности же оказалось, что бессмысленно создавать сложные выражения для проверки (и даже вредно), достаточно проверки на наличие @ и точки, и отправки письма с подтверждением регистрации. Ни в коем случае не хочу сказать, что совет пользователя fixxxer неудачный (скорее очень даже полезный), но хочу сказать спасибо за filter_var($email, FILTER_VALIDATE_EMAIL); пользователю флоппик, и за аналог idn_to_ascii() на php пользователю fixxxer. Такие советы на дороге не вяляются. :)
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
я не знал, что в адресах email допустимы комментарии!
 

Beavis

Banned
А какой смысл вообще так заморачиваться с проверкой адреса почты?
Мне кажется эта задача только теоретическая, на практике в ней нет смысла
 

fixxxer

К.О.
Партнер клуба
1) чтобы ругань увидел пользователь, сделавший опечатку, а не админ в логах сендмейла
2) чтобы не отрезать пользователя с экзотическим мылом - иногда встречаются
 

Beavis

Banned
1) чтобы ругань увидел пользователь, сделавший опечатку, а не админ в логах сендмейла
какую опечатку можно сделать в M.a_И-л[email protected]_И-л.-_1. ?) весь емейл как одна большая опечатка

чтобы не отрезать пользователя с экзотическим мылом - иногда встречаются
вот если убрать эти замороченные проверки, то и не будет отрезаться

По-моему, достаточно просто проверить что в строке одна собака, и вокруг неё есть какие-нибудь символы.. А от регулярок на пол-экрана не вижу толку
 

JSergRu

..ιilliιlιiιliιllilιι..
иногда вместо точки запятую ставят, проверка с помощью FILTER_VALIDATE_EMAIL прекрасно дополнит проверку на собаку с помощью js или html5, и лишней не будет )
 
Сверху