|
Модераторы: Aliance, skyboy, MoLeX, ksnk |
|
smartov |
|
||||
свой собственный Профиль Группа: Экс. модератор Сообщений: 4225 Регистрация: 2.2.2006 Где: NJ Репутация: 2 Всего: 259 |
Недавно вдруг захотелось написать дотошную регулярку на email - не как обычно буковки там проверил, немного на точку и собаку - а остальное не важно, а так чтобы не пропустило синтаксически невалидный адрес.
Имя
Доменное имя можеть быть вида my.cool.sub.domain.com Родилось вот это.
License - LGPL UPDATE: Как оказалось "Всё уже украдено до нас" (С)
Это сообщение отредактировал(а) smartov - 14.7.2008, 17:41 |
||||
|
|||||
flashaa |
|
|||
Опытный Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 1 Всего: 25 |
smartov у емейл и доменных имен есть вполне четкие спецификации в стандартах rfc и если писать дотошную регулярку, то стоило обратить внимание прежде всего туда. Там есть ещё некоторые подводные камни.
Последняя часть имени называется tld (top level domain) - ликбез. |
|||
|
||||
ksnk |
|
|||
прохожий Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: нет Всего: 386 |
-------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
SelenIT |
|
|||
баг форума Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: нет Всего: 401 |
Запись [0-9\w] избыточна, цифры (и даже подчеркивание, а при правильной локали - еще и русские буквы) уже входят в \w.
-------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
CyClon |
|
||||
Опытный Профиль Группа: Участник Сообщений: 838 Регистрация: 3.12.2005 Репутация: нет Всего: 4 |
В email недопустимы русские буквы, поэтому \w действительно избыточна. Я предпочитаю указывать конкретно набор допустимых символов, дабы избежать зависимости от настроек локали. Примерно так выглядит эта регулярка в моем исполнении:
Тобишь сначала идем учетная запись от 1 до 20 символов, потом знак @, за которым следуем одно или многоуровневое название сервера, дальше точка, после которой от 2 до 5 символов имя первого уровня. Вроде так. Это сообщение отредактировал(а) CyClon - 22.4.2008, 19:40 |
||||
|
|||||
flashaa |
|
|||
Опытный Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 1 Всего: 25 |
||||
|
||||
CyClon |
|
|||
Опытный Профиль Группа: Участник Сообщений: 838 Регистрация: 3.12.2005 Репутация: нет Всего: 4 |
flashaa, обоснуй плз
|
|||
|
||||
smartov |
|
|||
свой собственный Профиль Группа: Экс. модератор Сообщений: 4225 Регистрация: 2.2.2006 Где: NJ Репутация: 2 Всего: 259 |
flashaa, спасибо за комментарий, RFC я читал, но судя по вашему комментарию, плохо, думаю вы читали лучше и наверняка у вас есть лучший вариант регулярки, написанной вами. Не поделитесь?
ksnk, хыы |
|||
|
||||
SelenIT |
|
|||
баг форума Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: нет Всего: 401 |
CyClon, можно я обосную? ;)
1) a-Z - бессмысленный диапазон, потому что в ASCII (первая половина всех однобайтных кодировок + начало UTF-8) заглавные буквы идут раньше строчных. Но даже если диапазон и будет прочитан "задом наперед", туда попадут аж 6 левых символов; 2) валидным доменом окажется ......500; 3) есть 6-буквенные домены верхнего уровня (.museum, .travel). Вообще сколько раз обсуждали уже эту задачу . Вроде как давно общепринятое мнение, что единственный способ 100%-ной валидации e-mail - это посылка туда письма с подтверждающей ссылкой . Во всех остальных случаях юзер наверняка вобъет белиберду, не задумываясь. И чтобы заставить его задуматься (после чего ему может оказаться легче вспомнить и вбить настоящий е-mail, чем выдумывать левый;), в 90% случаев вполне достаточно той самой примитивной проверки на наличие собачки и точки (если не путаю, как раз похожую простейшую проверку делает нативный <input type="email"> в HTML5...). Ну и, само собой, при отправке по почте любых юзерских данных нужно нещадно резать все символы перевода строки и т.п. отовсюду, кроме тела письма (во избежание mail injection). -------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
smartov |
|
|||
свой собственный Профиль Группа: Экс. модератор Сообщений: 4225 Регистрация: 2.2.2006 Где: NJ Репутация: 2 Всего: 259 |
||||
|
||||
flashaa |
|
|||
Опытный Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 1 Всего: 25 |
smartov, да вариант есть. В свое время был изучен вопрос. Найду и скину сюда. Извиняюсь за голословность на данный момент.
СyСlon, SelenIT обосновал =) |
|||
|
||||
Akina |
|
|||
Советчик Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: нет Всего: 453 |
Вот синтаксически валидный адрес (см. напр. RFC 822, 3.4.1):
"My e-mail"@mycompany.ru -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
CyClon |
|
|||
Опытный Профиль Группа: Участник Сообщений: 838 Регистрация: 3.12.2005 Репутация: нет Всего: 4 |
SelenIT, flashaa, ок спасибо Ну, смысл я думаю понятен
Вообще такая регулярка еще и защищает от инъекции в некоторой степени, так что проверять емаил на наличие одной только собачки имхо не стоит |
|||
|
||||
source777 |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: нет Всего: 56 |
smartov Чтобы написать дотошную регулярку для email надо тупо взять RFC и записать его в синтаксисе регулярных выражений, получится естественно на полэкрана, зато дотошно, а так интуитивно как ты попытался сделать - это всё по сути баловство, с тем же успехом можно использовать что-нить типа: ^[a-z0-9.-]*[a-z0-9]@([a-z0-9-]*[a-z]\.?[a-z]+)+$
-------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
flashaa |
|
|||
Опытный Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 1 Всего: 25 |
Итак, пойдем по rfc822.
Поскольку эти документы содержат не стандарты, а рекомендации, некоторые варианты представления сущностей можно опустить. Рассмотрим только те, которые нам встречаются в реальной (точнее, виртуальной) жизни. email адрес состоит из локальной части и домена - это понятно. локальная часть может состоять: 1) Из слов, разделенных точками. Слово - последовательность любых символов кроме (, ), <, >, @, "," , ; , :, \, двойной кавычки, ., [, ], пробела, ASCII-управляющих символов( с кодами 0-37, 177, 127) 2) Из почти любых символов, заключенных в кавычки - этот вариант наверно опустим Вторая часть - домен. Домен состоит из субдоменов, разделенных точками. Субдомен - это либо слово (см. выше), либо доменный литерал - последовательность символов в квадратных скобках - этот вариант опустим. Соответственно, получаем такую регулярку:
Отличия от автора: - локальная часть не обязательно начинается с буквы - в локальном имени не могут быть две точки подрят - локальное имя может кончаться не только на буквы и цифры - ... все те же пункты, но по отношению к домену - не ограничен по длине tld - зачем это вообще надо - если уж беретесь, то отслеживайте каждый новый tld Вот это я понимаю дотошно =) Это сообщение отредактировал(а) flashaa - 23.4.2008, 23:31 |
|||
|
||||
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Избранное | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |