Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: регулярка для проверки e-mail
Форумы портала PHP.SU » PHP » Регулярные выражения » регулярка для проверки e-mail

Страниц (1): [1]
 

1. Саныч - 10 Апреля, 2011 - 17:59:59 - перейти к сообщению
Решил написать себе для сайта регулярку для проверки введеного e-mail-а. Но не просто так буквы, цифры, собака, еще буквы... А более точную...

Итак, что мы знаем об e-mail адресах:
1) все они такого типа <имя>@<домен>
2) имя может быть от 1 до 20 (по поводу 20 не уверен, но себе ограничил так) символов
3) имя может содержать: буквы, цифры, знаки _ - и точку.
4) имя может начинаться и заканчиваться только на букву или цифру
5) имя не может содержать подряд несколько символов (точек точно, а вот про - и _ опять таки не уверен)
6) домен по принципу имени

В итоге получилась вот такая регулярка
CODE (htmlphp):
скопировать код в буфер обмена
  1. /^[a-z0-9](([_\.-]?[a-z0-9]+)*){0,19}@([a-z0-9]([_-]?[a-z0-9]+)?\.){1,3}[a-z]{2,6}$/i


Вобщем жду критику по поводу того, как сделать ее еще более точной...
да и еще вопрос, есть ли сейчас e-mail-ы в зоне .рф?
2. EuGen - 10 Апреля, 2011 - 20:43:19 - перейти к сообщению
Возможно, Вам подойдет модификация этого:
http://habrahabr[dot]ru/blogs/regex/55820/
3. Champion - 10 Апреля, 2011 - 21:19:34 - перейти к сообщению
Саныч, регулярка нормальная, но по RFC адрес email может содержать много интересных символов(об этом сказано и в ссылке, приведенной EuGenом). Хотя я вроде не встречал почтовых серверов, позволяющих [#!&$...]

Если верить новостям, то
Цитата:
Почтовые ящики в зоне «.рф» заработают через три года
4. Саныч - 10 Апреля, 2011 - 22:08:16 - перейти к сообщению
Champion пишет:
по RFC адрес email может содержать много интересных символов

знаю, но чисто анализируя свои знания об email-ах, понимаю что кроме _ - и точки больше никакие символы не встречал, к тому же некоторые ящики вообще кроме точки ничего не разрешают, тот же gmail.com к примеру

EuGen, спасибо! Кое-что вспомнил... А вот http://ai[dot]/ для меня новость, как-то не встречал еще такого...
Исходя из всего этого, немного подредактировал
CODE (htmlphp):
скопировать код в буфер обмена
  1. /^[a-z0-9](([_\.-]|[a-z0-9])[a-z0-9]){0,10}@([a-z0-9](([_-]|[a-z0-9])[a-z0-9]){0,31}\.){1,3}[a-z]{2,6}$/i


еще вопросы:
1) длина имени, максимальное значение? Сейчас в регулярке 21 получается. Ящики используют кто 30, кто 32, некоторые вобще по-моему до 64. Так сколько же максимум?
2) длина части в домене (часть, всмысле кусочек отделеный точкой). Исходя из статьи которую кинул EuGen поставил на 63 символа, но на сколько я знаю максимум 255.
3) может лучше использовать filter_var() ?
5. Alek - 10 Апреля, 2011 - 23:29:05 - перейти к сообщению
Саныч, пробовал на своем хосте(5.1), как встречает filter_var(), так начинает ругаться...
PHP:
скопировать код в буфер обмена
  1.  
  2. $this->mail=$_POST['mail'];
  3.  
  4. if(preg_match("|^[[:alnum:]]{1,20}-?_?\.?[[:alnum:]]{1,}@?[A-z]{1,}\.?[A-z]{2,6}|i", $this->mail)==fals) {
  5. var_dump("неправильный ввод");
  6. }
  7. else{
  8. var_dump("$this->mail");}
  9.  


Оцените пожалуйста, чего я упустил?
6. Саныч - 11 Апреля, 2011 - 08:01:41 - перейти к сообщению
Alek пишет:
Оцените пожалуйста, чего я упустил?

особо не вглядывался в вашу регулярку, спешу, но какая-то она стремная Не понял сразу бросилось в глаза вот это @? По вашему в email-е может отсутствовать собака?)
Вобщем приду, вечером хорошо рассмотрю...
7. valenok - 12 Апреля, 2011 - 16:22:00 - перейти к сообщению
filter_validate_email использует вот такую регулярку:
PHP:
скопировать код в буфер обмена
  1.  
  2. const char regexp[] = "/^(?!(?:(?:\\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";


Я раньше использовал такую
PHP:
скопировать код в буфер обмена
  1. /^[-!#$%&\'*+\\.\/0-9=?A-Z^_`{|}~]+@([-0-9A-Z]+\.)+([0-9A-Z]){2,4}$/i

потом перешел на фильтры
8. Champion - 13 Апреля, 2011 - 20:24:02 - перейти к сообщению
valenok пишет:
filter_validate_email использует вот такую регулярку:
Ух ё. Основательно.
9. Саныч - 13 Апреля, 2011 - 21:04:00 - перейти к сообщению
все еще интересуют след. вопросы
Цитата:
еще вопросы:
1) длина имени, максимальное значение? Сейчас в регулярке 21 получается. Ящики используют кто 30, кто 32, некоторые вобще по-моему до 64. Так сколько же максимум?
2) длина части в домене (часть, всмысле кусочек отделеный точкой). Исходя из статьи которую кинул EuGen поставил на 63 символа, но на сколько я знаю максимум 255.
3) может лучше использовать filter_var() ?
10. Champion - 13 Апреля, 2011 - 21:09:02 - перейти к сообщению
Саныч пишет:
может лучше использовать filter_var()
Лучше. По идее он отфильтрует в соответствии со стандартом.
11. Саныч - 13 Апреля, 2011 - 21:13:43 - перейти к сообщению
Champion, ок, понял... Но в конкретном примере я проверяю email в браузере, т.е. через js. Идет проверка на валидность и соответственно вывод опред. сообщения пользователю...
12. Champion - 13 Апреля, 2011 - 21:26:55 - перейти к сообщению
А со стороны браузера filter_var нету, да.
http://en[dot]wikipedia[dot]org/wiki/Email_address
http://iqa[dot]com[dot]ua/articles/objec[dot][dot][dot]resa_chitaem_rfc
The local-part of an email address may be up to 64 characters long and the domain name may have a maximum of 253 characters. However, the maximum length of a forward or reverse path length of 256 characters restricts the entire email address to be no more than 254 characters.[1] Some mail protocols, such as X.400, may require larger objects, however. The SMTP specification recommends that software implementations impose no limits for the lengths of such objects.
Далее список разрешенных символов.

Вот, собственно, всё что касается и длины, и разр. символов. Регулярок тут достаточно привели - выбирай любую)
13. Саныч - 13 Апреля, 2011 - 21:56:14 - перейти к сообщению
Champion, спасибо! В принципе ничего нового, и так знал, просто был не до конца уверен.
Уже выбрал, остаюсь при своей, единственное что подкорректирую ее под 64 и 253, ну, а на стороне сервера скорей всего через filter_var сделаю...

 

Powered by ExBB FM 1.0 RC1