|
Модераторы: 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 |
|||
|
||||
Fortop |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: нет Всего: 42 |
[email protected] Добавлено через 2 минуты и 36 секунд flashaa, считает валидным smartov, считает невалидным. -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
SelenIT |
|
|||
баг форума Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: нет Всего: 401 |
Домены из одних цифр существуют (минский блог 017.by, куча фирм с доменом == номеру телефона). Имхо, вариант flashaa прав
-------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
smartov |
|
|||
свой собственный Профиль Группа: Экс. модератор Сообщений: 4225 Регистрация: 2.2.2006 Где: NJ Репутация: 2 Всего: 259 |
Итого я подправил регулярку.
Добавил разрешение начинаться и заканчивать цифрами для всех частей, кроме tld. В регулярке flashaa, никаких особых новшеств не нашел, может он мне пояснит доступно чем она отличается от моей с цифрами (кроме ограничения по длине tld). Добавлено через 2 минуты и 38 секунд Ну и лицензию на Lesser |
|||
|
||||
SelenIT |
|
|||
баг форума Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: нет Всего: 401 |
smartov, и все равно [0-9\-\_\w] ;)
Это сообщение отредактировал(а) SelenIT - 24.4.2008, 11:35 -------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
flashaa |
|
||||
Опытный Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 1 Всего: 25 |
И что? Ответ SelenIT уже дал. Можно ещё с десяток циферных накидать. И читать надо коменты.
ну как же не нашел то? Для кого я писал на той странице отдельный пункт? Хорошо, сейчас наскребу все отличия. Точнее попытаюсь наскрести, т.к. в памяти не держу, что было в вашей старой регулярке =) 1) У вас что имя что домен начинаются обязательно на букву и заканчиваются на букву, в середине могут быть буквы, цифры, точки. На самом деле первая и последняя буква ничем ни отличаюся от букв в середине. - это ваши постулаты которые неверны 2) У вас кажется была просто ошибка того, что можно было 2 точки подрят написать НУ и собственно все.. Сложно накопать важные момент в валидации строки с собачкой. Просто суть в том, что моя регулярка дотошна =) Да и ещё если совсем докопаться, то rfc подразумевает, что набор символов ascii. Поэтому если есть символы с кодами больше 127, то можно сразу отбрасывать такой емейл |
||||
|
|||||
Fortop |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: нет Всего: 42 |
Да бусть себе существуют сколько угодно Вы мне можете привести домены первого уровня 1.org, a.net, b.com и т.д.? нет? -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
SelenIT |
|
|||
баг форума Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: нет Всего: 401 |
Fortop, как минимум, есть z.com.
-------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
Fortop |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: нет Всего: 42 |
SelenIT, точно и не только он
был не прав. -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
SelenIT |
|
|||
баг форума Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: нет Всего: 401 |
-------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
smartov |
|
||||
свой собственный Профиль Группа: Экс. модератор Сообщений: 4225 Регистрация: 2.2.2006 Где: NJ Репутация: 2 Всего: 259 |
Черт, пропустил
Теперь не правы вы. В RFC четско написано что в этих местах не могут быть точки, подчеркивания, дефисы.
Кажется - креститься надо. Не было такой ошибки Он и отбрасывается Учитывая мои ответы выше... так где же дотошность? То же самое но другими словами еще и с ограничением на вложенность доменов. Это сообщение отредактировал(а) smartov - 24.4.2008, 15:12 |
||||
|
|||||
flashaa |
|
||||
Опытный Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 1 Всего: 25 |
Можно цитату? Я лично ориентировался на это: http://www.faqs.org/rfcs/rfc822.html , раздел 6. Не надо было править \w - может включать не ASCII
Нет такого ограничения. Смотрите внимательнее. А где дотошность - это у вас надо спросить, как у автора. Это сообщение отредактировал(а) flashaa - 24.4.2008, 18:05 |
||||
|
|||||
Fortop |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: нет Всего: 42 |
flashaa,
smartov, Ну чего вы взъелись? завязывайте меня обе устраивают -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
SelenIT |
|
|||
баг форума Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: нет Всего: 401 |
flashaa, ошибка с двумя точками подряд была у CyClonа. У smartovа это было с самого начала предусмотрено.
Похоже, все-таки есть, только в другом RFC:
-------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
smartov |
|
|||
свой собственный Профиль Группа: Экс. модератор Сообщений: 4225 Регистрация: 2.2.2006 Где: NJ Репутация: 2 Всего: 259 |
Можно
http://en.wikipedia.org/wiki/E-mail_address С тире в начале и конце высмотрел где-то в другом месте как распространенное ограничение. А с подчеркиваниями сам не знаю откуда взял, думаю надо внести в список разрешенных символов. На самом деле, конечно, ограничения очень зависят от сервера. Об этом много написано даже на Википедии, например наличие того же знака + в адресе. GMail его разрешает, а Hotmail нет. Цель этой темы - охватить наиболее стандартный круг, в попытке свести возможность пользовательской ошибки к минимуму минимальными затратами. Гражданин, мне в общем-то глубоко плевать веришь ты мне или нет, и ради Вашей Царской Персоны (далее ВЦП) и ненужного спора хранить пост я не собирался. |
|||
|
||||
flashaa |
|
|||
Опытный Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 1 Всего: 25 |
smartov, помоему это твоя ВЦП слишком многого хочет.
"Анука расскажи мне чем там моя от твоей отличалась" Я вообще-то никому ничего рассказывать не обязан. А уж я отнесся черезчур уважительно походу. Ну чтож. Больше я так делать не буду. "Ваша регулярка ацтой" напишу я. И довольствуйтесь этим. Ваша тема называется дотошная регулярка, а написано в ней было самое что ни на есть банальное рег. выр, необоснованное. Вот в чем беда. Как я уже писал, спор это двое человек. Если спор не нужен, чтоже мы этот ненужный спор подогреваем, постим мне ругань и перешли на ты, а? Может начнем с себя в воспитании окружающих? Я вот лично это сделать могу. В отличии от оскорбленного критикой самолюбия великого неошибающегося smartov'a, чьи посты надо читать как аксиомы. Больше в этой теме я не пишу и радуйтесь восхищенным постам тех, кто "курит форумы" и создает темы "у меня ошибка, что делать!". Это сообщение отредактировал(а) flashaa - 25.4.2008, 11:11 |
|||
|
||||
SelenIT |
|
|||
баг форума Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: нет Всего: 401 |
Фхтагн, а ведь теперь действительно пропустит "домен" ......1.com (я-то был уверен, что там повтор на весь фрагмент между точками стоит, даже не вчитывался)... Вообще, ссылку на самую сабжевую регулярку дал ksnk, а самую практичную (имхо) привел source777 -------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
smartov |
|
|||
свой собственный Профиль Группа: Экс. модератор Сообщений: 4225 Регистрация: 2.2.2006 Где: NJ Репутация: 2 Всего: 259 |
Пропустит. ХЗ. May be. В любом случае эта более точнаяя чем от source777, если нужна будет регулярка и писать ее не надо то не все ли равно на чем делать Ctrl+C, а если сабжевая дает чуть больше контроля - то почему бы и не её |
|||
|
||||
source777 |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: нет Всего: 56 |
Копировать конечно всё равно что, но вот только то, что ты возишься со своей регуляркой уже 2 дня не дало ей этих самых "чуть больше контроля", например, мыло [email protected] или [email protected] твоя регулярка считает правильными, а моя - нет... Хотя в моей регулярке также есть недочёты, но это и понятно, учитывая что я её 5 минут писал, а не 2 дня... зато получилось как говорится быстро и сердито, хотя можно её дополнить до чего-нить типа ^([a-z0-9][a-z0-9-]*[a-z0-9]\.?)*[a-z0-9]@([a-z0-9]\.|[a-z0-9][a-z0-9-]*[a-z0-9]\.)+[a-z]{2,6}$ P.S. Степень контроля можно увеличивать до тех самых пор, пока регулярка не займёт полэкрана, тут самое главное вовремя вспомнить такое понятие как "достаточно", ведь чем длиннее регэксп, тем медленнее он будет обрабатываться... Это сообщение отредактировал(а) source777 - 25.4.2008, 21:25 -------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
smartov |
|
|||
свой собственный Профиль Группа: Экс. модератор Сообщений: 4225 Регистрация: 2.2.2006 Где: NJ Репутация: 2 Всего: 259 |
||||
|
||||
bugmenot |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 135 Регистрация: 3.7.2006 Репутация: нет Всего: 1 |
--------------------
доска объявленийвсе о горных велосипедах |
|||
|
||||
maxbrown |
|
|||
Новичок Профиль Группа: Awaiting Authorisation Сообщений: 26 Регистрация: 16.6.2008 Где: Obninsk sci-city Репутация: нет Всего: нет |
Ээ... Граждане, а может, начать стоит с описания формата e-mail адреса по RFC822?
|
|||
|
||||
Sanchezzz |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1670 Регистрация: 19.11.2006 Где: Voronezh Репутация: нет Всего: 60 |
/\w+@\w+\.\w{2,6}/
-------------------- Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS. |
|||
|
||||
nerezus |
|
|||
Вселенский отказник Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: нет Всего: 43 |
Sanchezzz, в рот тебе ноги. После стольких страниц постить такое Г... додумался блин...
множесто нормальных рабочих мейлов такой "валидации" не выдержит. |
|||
|
||||
americanets |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1100 Регистрация: 27.9.2006 Репутация: 1 Всего: 12 |
filter_var + FILTER_VALIDATE_EMAIL для php > 5.2
-------------------- Пусть популярную музыку слушают те, среди кого она популярна |
|||
|
||||
smartov |
|
|||
свой собственный Профиль Группа: Экс. модератор Сообщений: 4225 Регистрация: 2.2.2006 Где: NJ Репутация: 2 Всего: 259 |
americanets, вротмненоги! Век живи век учись! Держи плюса.
|
|||
|
||||
unicross |
|
|||
Опытный Профиль Группа: Участник Сообщений: 422 Регистрация: 15.6.2008 Репутация: нет Всего: 53 |
Русские буквы в адресе E-mail функция filter_var() считает допустимыми. На мой взгляд это косяк...
E-mail привет@mail.ru врядли будет существовать... |
|||
|
||||
theworldcreator |
|
|||
Опытный Профиль Группа: Участник Сообщений: 362 Регистрация: 25.8.2007 Где: Москва Репутация: нет Всего: 13 |
То-есть это — самая дотошная проверка? |
|||
|
||||
unicross |
|
|||
Опытный Профиль Группа: Участник Сообщений: 422 Регистрация: 15.6.2008 Репутация: нет Всего: 53 |
theworldcreator, немного добавлю и кое-что изменю:
|
|||
|
||||
theworldcreator |
|
|||
Опытный Профиль Группа: Участник Сообщений: 362 Регистрация: 25.8.2007 Где: Москва Репутация: нет Всего: 13 |
Спасибо. Самым большим откровением стало отсутствие ё в перечисление а-я. Причем только что проверил — range('а', 'я') тоже его не включает.
|
|||
|
||||
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Избранное | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |