Модераторы: Aliance, skyboy, MoLeX, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Валидность email - самая дотошная регулярка 
:(
    Опции темы
smartov
Дата 22.4.2008, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 2
Всего: 259



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

Имя 
  •  Должно начинаться с буквы/цифры
  •  Не дожно содержать символов кроме [0-9a-zA-Z\-\_\.]
  •  Не должно содержать двух точек подряд
  •  Должно заканчиваться на букву/цифру
С политикой имени домена всё аналогично. Последняя часть доменного имени (com, info ...) должна состоять из 2-6 буквенных символов.
Доменное имя можеть быть вида my.cool.sub.domain.com

Родилось вот это.

Код

<?php

$email = '[email protected]';
$regexp = '^[0-9a-zA-Z]([0-9a-zA-Z\-\_]+\.)*[0-9a-zA-Z]*@[a-zA-Z0-9]*([0-9a-zA-Z\-\_]+\.)*[0-9a-zA-Z]+\.[a-zA-Z]{2,6}$';

var_dump( preg_match("/$regexp/", $email) );

?>


License - LGPL smile

UPDATE:
Как оказалось "Всё уже украдено до нас" (С)

Код

var_dump(filter_var('[email protected]', FILTER_VALIDATE_EMAIL));


Это сообщение отредактировал(а) smartov - 14.7.2008, 17:41
PM MAIL   Вверх
flashaa
Дата 22.4.2008, 15:24 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 1
Всего: 25



smartov у емейл и доменных имен есть вполне четкие спецификации в стандартах rfc и если писать дотошную регулярку, то стоило обратить внимание прежде всего туда. Там есть ещё некоторые подводные камни.
Последняя часть имени называется tld (top level domain) - ликбез.
PM MAIL   Вверх
ksnk
Дата 22.4.2008, 15:26 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: нет
Всего: 386



GPL - неправильно, нужно LGPL  smile 

А как-же всякие навороченные регулярки на пол-экрана?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
SelenIT
Дата 22.4.2008, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: нет
Всего: 401



Запись [0-9\w] избыточна, цифры (и даже подчеркивание, а при правильной локали - еще и русские буквы) уже входят в \w.


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
CyClon
Дата 22.4.2008, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: нет
Всего: 4



Код
Запись [0-9\w] избыточна, цифры (и даже подчеркивание, а при правильной локали - еще и русские буквы) уже входят в \w. 

В email недопустимы русские буквы, поэтому \w действительно избыточна. Я предпочитаю указывать конкретно набор допустимых символов, дабы избежать зависимости от настроек локали.

Примерно так выглядит эта регулярка в моем исполнении:

Код
~^[a-Z0-9_.-]{1,20}@[a-Z0-9.-]+\.[a-Z0-9]{2,5}$~


Тобишь сначала идем учетная запись от 1 до 20 символов, потом знак @, за которым следуем одно или многоуровневое название сервера, дальше точка, после которой от 2 до 5 символов имя первого уровня. Вроде так.

Это сообщение отредактировал(а) CyClon - 22.4.2008, 19:40


--------------------
user posted image
PM   Вверх
flashaa
Дата 22.4.2008, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 1
Всего: 25



Цитата(CyClon @  22.4.2008,  18:50 Найти цитируемый пост)
Вроде так

не так =)
PM MAIL   Вверх
CyClon
Дата 22.4.2008, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: нет
Всего: 4



flashaa, обоснуй плз smile


--------------------
user posted image
PM   Вверх
smartov
Дата 22.4.2008, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 2
Всего: 259



flashaa, спасибо за комментарий, RFC я читал, но судя по вашему комментарию, плохо, думаю вы читали лучше и наверняка у вас есть лучший вариант регулярки, написанной вами. Не поделитесь?

ksnk, хыы  smile  smile 
PM MAIL   Вверх
SelenIT
Дата 22.4.2008, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: нет
Всего: 401



CyClon, можно я обосную? ;)
1) a-Z - бессмысленный диапазон, потому что в ASCII (первая половина всех однобайтных кодировок + начало UTF-8) заглавные буквы идут раньше строчных. Но даже если диапазон и будет прочитан "задом наперед", туда попадут аж 6 левых символов;
2) валидным доменом окажется ......500;
3) есть 6-буквенные домены верхнего уровня (.museum, .travel).

Вообще сколько раз обсуждали уже эту задачу smile. Вроде как давно общепринятое мнение, что единственный способ 100%-ной валидации e-mail - это посылка туда письма с подтверждающей ссылкой smile. Во всех остальных случаях юзер наверняка вобъет белиберду, не задумываясь. И чтобы заставить его задуматься (после чего ему может оказаться легче вспомнить и вбить настоящий е-mail, чем выдумывать левый;), в 90% случаев вполне достаточно той самой примитивной проверки на наличие собачки и точки (если не путаю, как раз похожую простейшую проверку делает нативный <input type="email"> в HTML5...). Ну и, само собой, при отправке по почте любых юзерских данных нужно нещадно резать все символы перевода строки и т.п. отовсюду, кроме тела письма (во избежание mail injection).


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
smartov
Дата 22.4.2008, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 2
Всего: 259



Цитата(SelenIT @  22.4.2008,  16:35 Найти цитируемый пост)
Запись [0-9\w] избыточна, цифры (и даже подчеркивание, а при правильной локали - еще и русские буквы) уже входят в \w. 

Точно smile Нужно будет поправить
PM MAIL   Вверх
flashaa
Дата 23.4.2008, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 1
Всего: 25



smartov, да вариант есть. В свое время был изучен вопрос. Найду и скину сюда. Извиняюсь за голословность на данный момент.
СyСlonSelenIT обосновал =)
PM MAIL   Вверх
Akina
Дата 23.4.2008, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 453



Вот синтаксически валидный адрес (см. напр. RFC 822, 3.4.1):

"My e-mail"@mycompany.ru


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
CyClon
Дата 23.4.2008, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: нет
Всего: 4



SelenITflashaa, ок спасибо smile Ну, смысл я думаю понятен smile

Вообще такая регулярка еще и защищает от инъекции в некоторой степени, так что проверять емаил на наличие одной только собачки имхо не стоит smile


--------------------
user posted image
PM   Вверх
source777
Дата 23.4.2008, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: нет
Всего: 56



smartov Чтобы написать дотошную регулярку для email надо тупо взять RFC и записать его в синтаксисе регулярных выражений, получится естественно на полэкрана, зато дотошно, а так интуитивно как ты попытался сделать - это всё по сути баловство, с тем же успехом можно использовать что-нить типа: ^[a-z0-9.-]*[a-z0-9]@([a-z0-9-]*[a-z]\.?[a-z]+)+$



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
flashaa
Дата 23.4.2008, 23:28 (ссылка) |  (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 1
Всего: 25



Итак, пойдем по rfc822.
Поскольку эти документы содержат не стандарты, а рекомендации, некоторые варианты представления сущностей можно опустить. Рассмотрим только те, которые нам встречаются в реальной (точнее, виртуальной) жизни.

email адрес состоит из локальной части и домена - это понятно.
локальная часть может состоять:
1) Из слов, разделенных точками. Слово - последовательность любых символов кроме (, ), <, >, @, "," , ; , :, \, двойной кавычки, ., [, ], пробела, ASCII-управляющих символов( с кодами 0-37, 177, 127)
2) Из почти любых символов, заключенных в кавычки - этот вариант наверно опустим

Вторая часть - домен.
Домен состоит из субдоменов, разделенных точками.
Субдомен - это либо слово (см. выше), либо доменный литерал - последовательность символов в квадратных скобках - этот вариант опустим.

Соответственно, получаем такую регулярку:

Код

$word = '(?:[^()<>@,.;:\"\[\]\s\0-\37\177\127]+?)';
$local_part = $word . '(?:\.' . $word . ')*?';
$subdomain = $word . '(?:\.' . $word . ')*?';
$domain = $subdomain . '(?:\.' . $subdomain . ')+?';
$email = '/^'. $local_part . '@' . $domain . '$/';


Отличия от автора:
 - локальная часть не обязательно начинается с буквы
 - в локальном имени не могут быть две точки подрят
 - локальное имя может кончаться не только на буквы и цифры 
 - ... все те же пункты, но по отношению к домену
 - не ограничен по длине tld - зачем это вообще надо - если уж беретесь, то отслеживайте каждый новый tld

Вот это я понимаю дотошно =)


Это сообщение отредактировал(а) flashaa - 23.4.2008, 23:31
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Избранное | Следующая тема »


 




[ Время генерации скрипта: 0.1764 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.