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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: регулярка для проверки e-mail

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Саныч
Отправлено: 10 Апреля, 2011 - 17:59:59
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


Помог: 62 раз(а)




Решил написать себе для сайта регулярку для проверки введеного 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-ы в зоне .рф?

(Отредактировано автором: 10 Апреля, 2011 - 18:01:56)



-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
EuGen Администратор
Отправлено: 10 Апреля, 2011 - 20:43:19
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Возможно, Вам подойдет модификация этого:
http://habrahabr[dot]ru/blogs/regex/55820/


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Champion Супермодератор
Отправлено: 10 Апреля, 2011 - 21:19:34
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Саныч, регулярка нормальная, но по RFC адрес email может содержать много интересных символов(об этом сказано и в ссылке, приведенной EuGenом). Хотя я вроде не встречал почтовых серверов, позволяющих [#!&$...]

Если верить новостям, то
Цитата:
Почтовые ящики в зоне «.рф» заработают через три года
 
 Top
Саныч
Отправлено: 10 Апреля, 2011 - 22:08:16
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


Помог: 62 раз(а)




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() ?

(Отредактировано автором: 10 Апреля, 2011 - 22:22:45)



-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
Alek
Отправлено: 10 Апреля, 2011 - 23:29:05
Post Id


Новичок


Покинул форум
Сообщений всего: 52
Дата рег-ции: Март 2011  
Откуда: Набережные Челны


Помог: 0 раз(а)




Саныч, пробовал на своем хосте(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.  


Оцените пожалуйста, чего я упустил?

(Отредактировано автором: 11 Апреля, 2011 - 00:15:24)

 
 Top
Саныч
Отправлено: 11 Апреля, 2011 - 08:01:41
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


Помог: 62 раз(а)




Alek пишет:
Оцените пожалуйста, чего я упустил?

особо не вглядывался в вашу регулярку, спешу, но какая-то она стремная Не понял сразу бросилось в глаза вот это @? По вашему в email-е может отсутствовать собака?)
Вобщем приду, вечером хорошо рассмотрю...


-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
valenok
Отправлено: 12 Апреля, 2011 - 16:22:00
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


Помог: 3 раз(а)




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

потом перешел на фильтры

(Отредактировано автором: 12 Апреля, 2011 - 16:25:38)



-----
Truly yours, Sasha.
 
My status
 Top
Champion Супермодератор
Отправлено: 13 Апреля, 2011 - 20:24:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




valenok пишет:
filter_validate_email использует вот такую регулярку:
Ух ё. Основательно.
 
 Top
Саныч
Отправлено: 13 Апреля, 2011 - 21:04:00
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


Помог: 62 раз(а)




все еще интересуют след. вопросы
Цитата:
еще вопросы:
1) длина имени, максимальное значение? Сейчас в регулярке 21 получается. Ящики используют кто 30, кто 32, некоторые вобще по-моему до 64. Так сколько же максимум?
2) длина части в домене (часть, всмысле кусочек отделеный точкой). Исходя из статьи которую кинул EuGen поставил на 63 символа, но на сколько я знаю максимум 255.
3) может лучше использовать filter_var() ?


-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
Champion Супермодератор
Отправлено: 13 Апреля, 2011 - 21:09:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Саныч пишет:
может лучше использовать filter_var()
Лучше. По идее он отфильтрует в соответствии со стандартом.
 
 Top
Саныч
Отправлено: 13 Апреля, 2011 - 21:13:43
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


Помог: 62 раз(а)




Champion, ок, понял... Но в конкретном примере я проверяю email в браузере, т.е. через js. Идет проверка на валидность и соответственно вывод опред. сообщения пользователю...


-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
Champion Супермодератор
Отправлено: 13 Апреля, 2011 - 21:26:55
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




А со стороны браузера 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.
Далее список разрешенных символов.

Вот, собственно, всё что касается и длины, и разр. символов. Регулярок тут достаточно привели - выбирай любую)
 
 Top
Саныч
Отправлено: 13 Апреля, 2011 - 21:56:14
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


Помог: 62 раз(а)




Champion, спасибо! В принципе ничего нового, и так знал, просто был не до конца уверен.
Уже выбрал, остаюсь при своей, единственное что подкорректирую ее под 64 и 253, ну, а на стороне сервера скорей всего через filter_var сделаю...
Тема закрыта!


-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Регулярные выражения »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB