| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Избранное > Валидность email - самая дотошная регулярка |
| Автор: smartov 22.4.2008, 15:01 | ||||
| Недавно вдруг захотелось написать дотошную регулярку на email - не как обычно буковки там проверил, немного на точку и собаку - а остальное не важно, а так чтобы не пропустило синтаксически невалидный адрес. Имя
Доменное имя можеть быть вида my.cool.sub.domain.com Родилось вот это.
License - LGPL UPDATE: Как оказалось "Всё уже украдено до нас" (С)
|
| Автор: flashaa 22.4.2008, 15:24 |
| smartov у емейл и доменных имен есть вполне четкие спецификации в стандартах rfc и если писать дотошную регулярку, то стоило обратить внимание прежде всего туда. Там есть ещё некоторые подводные камни. Последняя часть имени называется tld (top level domain) - ликбез. |
| Автор: ksnk 22.4.2008, 15:26 |
| GPL - неправильно, нужно LGPL А как-же всякие навороченные http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html? |
| Автор: SelenIT 22.4.2008, 16:35 |
| Запись [0-9\w] избыточна, цифры (и даже подчеркивание, а при правильной локали - еще и русские буквы) уже входят в \w. |
| Автор: CyClon 22.4.2008, 18:50 | ||||
В email недопустимы русские буквы, поэтому \w действительно избыточна. Я предпочитаю указывать конкретно набор допустимых символов, дабы избежать зависимости от настроек локали. Примерно так выглядит эта регулярка в моем исполнении:
Тобишь сначала идем учетная запись от 1 до 20 символов, потом знак @, за которым следуем одно или многоуровневое название сервера, дальше точка, после которой от 2 до 5 символов имя первого уровня. Вроде так. |
| Автор: flashaa 22.4.2008, 19:15 |
не так =) |
| Автор: CyClon 22.4.2008, 19:40 |
| flashaa, обоснуй плз |
| Автор: smartov 22.4.2008, 22:01 |
| flashaa, спасибо за комментарий, RFC я читал, но судя по вашему комментарию, плохо, думаю вы читали лучше и наверняка у вас есть лучший вариант регулярки, написанной вами. Не поделитесь? ksnk, хыы |
| Автор: SelenIT 22.4.2008, 22:01 |
| CyClon, можно я обосную? ;) 1) a-Z - бессмысленный диапазон, потому что в http://ru.wikipedia.org/wiki/ASCII (первая половина всех однобайтных кодировок + начало UTF-8) заглавные буквы идут раньше строчных. Но даже если диапазон и будет прочитан "задом наперед", туда попадут аж 6 левых символов; 2) валидным доменом окажется ......500; 3) есть 6-буквенные домены верхнего уровня (.museum, .travel). Вообще сколько раз обсуждали уже эту задачу |
| Автор: flashaa 23.4.2008, 11:45 |
| smartov, да вариант есть. В свое время был изучен вопрос. Найду и скину сюда. Извиняюсь за голословность на данный момент. СyСlon, SelenIT обосновал =) |
| Автор: Akina 23.4.2008, 12:53 |
| Вот синтаксически валидный адрес (см. напр. RFC 822, 3.4.1): "My e-mail"@mycompany.ru |
| Автор: CyClon 23.4.2008, 13:05 |
| SelenIT, flashaa, ок спасибо Вообще такая регулярка еще и защищает от инъекции в некоторой степени, так что проверять емаил на наличие одной только собачки имхо не стоит |
| Автор: source777 23.4.2008, 22:11 |
| smartov Чтобы написать дотошную регулярку для email надо тупо взять RFC и записать его в синтаксисе регулярных выражений, получится естественно на полэкрана, зато дотошно, а так интуитивно как ты попытался сделать - это всё по сути баловство, с тем же успехом можно использовать что-нить типа: ^[a-z0-9.-]*[a-z0-9]@([a-z0-9-]*[a-z]\.?[a-z]+)+$ |
| Автор: flashaa 23.4.2008, 23:28 | ||
| Итак, пойдем по rfc822. Поскольку эти документы содержат не стандарты, а рекомендации, некоторые варианты представления сущностей можно опустить. Рассмотрим только те, которые нам встречаются в реальной (точнее, виртуальной) жизни. email адрес состоит из локальной части и домена - это понятно. локальная часть может состоять: 1) Из слов, разделенных точками. Слово - последовательность любых символов кроме (, ), <, >, @, "," , ; , :, \, двойной кавычки, ., [, ], пробела, ASCII-управляющих символов( с кодами 0-37, 177, 127) 2) Из почти любых символов, заключенных в кавычки - этот вариант наверно опустим Вторая часть - домен. Домен состоит из субдоменов, разделенных точками. Субдомен - это либо слово (см. выше), либо доменный литерал - последовательность символов в квадратных скобках - этот вариант опустим. Соответственно, получаем такую регулярку:
Отличия от автора: - локальная часть не обязательно начинается с буквы - в локальном имени не могут быть две точки подрят - локальное имя может кончаться не только на буквы и цифры - ... все те же пункты, но по отношению к домену - не ограничен по длине tld - зачем это вообще надо - если уж беретесь, то отслеживайте каждый новый tld Вот это я понимаю дотошно =) |
| Автор: Fortop 24.4.2008, 06:40 |
1@1.ru Добавлено через 2 минуты и 36 секунд flashaa, считает валидным smartov, считает невалидным. |
| Автор: SelenIT 24.4.2008, 10:03 |
| Домены из одних цифр существуют (минский блог 017.by, куча фирм с доменом == номеру телефона). Имхо, вариант flashaa прав |
| Автор: smartov 24.4.2008, 11:13 |
| Итого я подправил регулярку. Добавил разрешение начинаться и заканчивать цифрами для всех частей, кроме tld. В регулярке flashaa, никаких особых новшеств не нашел, может он мне пояснит доступно чем она отличается от моей с цифрами (кроме ограничения по длине tld). Добавлено через 2 минуты и 38 секунд Ну и лицензию на Lesser |
| Автор: SelenIT 24.4.2008, 11:35 |
| smartov, и все равно [0-9\-\_\w] ;) |
| Автор: flashaa 24.4.2008, 11:54 | ||
И что? Ответ SelenIT уже дал. Можно ещё с десяток циферных накидать. И читать надо коменты.
ну как же не нашел то? Для кого я писал на той странице отдельный пункт? Хорошо, сейчас наскребу все отличия. Точнее попытаюсь наскрести, т.к. в памяти не держу, что было в вашей старой регулярке =) 1) У вас что имя что домен начинаются обязательно на букву и заканчиваются на букву, в середине могут быть буквы, цифры, точки. На самом деле первая и последняя буква ничем ни отличаюся от букв в середине. - это ваши постулаты которые неверны 2) У вас кажется была просто ошибка того, что можно было 2 точки подрят написать НУ и собственно все.. Сложно накопать важные момент в валидации строки с собачкой. Просто суть в том, что моя регулярка дотошна =) Да и ещё если совсем докопаться, то rfc подразумевает, что набор символов ascii. Поэтому если есть символы с кодами больше 127, то можно сразу отбрасывать такой емейл |
| Автор: Fortop 24.4.2008, 12:18 | ||
Да бусть себе существуют сколько угодно Вы мне можете привести домены первого уровня 1.org, a.net, b.com и т.д.? нет? |
| Автор: SelenIT 24.4.2008, 12:58 |
| Fortop, как минимум, есть http://z.com/. |
| Автор: Fortop 24.4.2008, 13:45 |
| SelenIT, точно был не прав. |
| Автор: SelenIT 24.4.2008, 15:00 |
http://www.the-end.name/archives/103 |
| Автор: smartov 24.4.2008, 15:11 | ||||||
Черт, пропустил
Теперь не правы вы. В RFC четско написано что в этих местах не могут быть точки, подчеркивания, дефисы.
Кажется - креститься надо. Не было такой ошибки
Он и отбрасывается Учитывая мои ответы выше... так где же дотошность? То же самое но другими словами еще и с ограничением на вложенность доменов. |
| Автор: flashaa 24.4.2008, 17:48 | ||||
Можно цитату? Я лично ориентировался на это: http://www.faqs.org/rfcs/rfc822.html , раздел 6. Не надо было править \w - может включать не ASCII
Нет такого ограничения. Смотрите внимательнее. А где дотошность - это у вас надо спросить, как у автора. |
| Автор: Fortop 24.4.2008, 18:23 |
| flashaa, smartov, Ну чего вы взъелись? |
| Автор: SelenIT 24.4.2008, 18:27 | ||
| flashaa, ошибка с двумя точками подряд была у CyClonа. У smartovа это было с самого начала предусмотрено. Похоже, все-таки есть, только в http://www.wast2000.de/tcp/url.htm:
|
| Автор: smartov 24.4.2008, 21:06 | ||
Можно
http://en.wikipedia.org/wiki/E-mail_address С тире в начале и конце высмотрел где-то в другом месте как распространенное ограничение. А с подчеркиваниями сам не знаю откуда взял, думаю надо внести в список разрешенных символов. На самом деле, конечно, ограничения очень зависят от сервера. Об этом много написано даже на Википедии, например наличие того же знака + в адресе. GMail его разрешает, а Hotmail нет. Цель этой темы - охватить наиболее стандартный круг, в попытке свести возможность пользовательской ошибки к минимуму минимальными затратами. Гражданин, мне в общем-то глубоко плевать веришь ты мне или нет, и ради Вашей Царской Персоны (далее ВЦП) и ненужного спора хранить пост я не собирался. |
| Автор: flashaa 25.4.2008, 11:00 |
| smartov, помоему это твоя ВЦП слишком многого хочет. "Анука расскажи мне чем там моя от твоей отличалась" Я вообще-то никому ничего рассказывать не обязан. А уж я отнесся черезчур уважительно походу. Ну чтож. Больше я так делать не буду. "Ваша регулярка ацтой" напишу я. И довольствуйтесь этим. Ваша тема называется дотошная регулярка, а написано в ней было самое что ни на есть банальное рег. выр, необоснованное. Вот в чем беда. Как я уже писал, спор это двое человек. Если спор не нужен, чтоже мы этот ненужный спор подогреваем, постим мне ругань и перешли на ты, а? Может начнем с себя в воспитании окружающих? Я вот лично это сделать могу. В отличии от оскорбленного критикой самолюбия великого неошибающегося smartov'a, чьи посты надо читать как аксиомы. Больше в этой теме я не пишу и радуйтесь восхищенным постам тех, кто "курит форумы" и создает темы "у меня ошибка, что делать!". |
| Автор: SelenIT 25.4.2008, 11:45 |
Фхтагн, а ведь теперь действительно пропустит "домен" ......1.com (я-то был уверен, что там повтор на весь фрагмент между точками стоит, даже не вчитывался)... Вообще, ссылку на самую сабжевую регулярку дал ksnk, а самую практичную (имхо) привел source777 |
| Автор: smartov 25.4.2008, 17:18 | ||
Пропустит. ХЗ. May be. В любом случае эта более точнаяя чем от source777, если нужна будет регулярка и писать ее не надо то не все ли равно на чем делать Ctrl+C, а если сабжевая дает чуть больше контроля - то почему бы и не её |
| Автор: source777 25.4.2008, 21:20 | ||
^([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. Степень контроля можно увеличивать до тех самых пор, пока регулярка не займёт полэкрана, тут самое главное вовремя вспомнить такое понятие как "достаточно", ведь чем длиннее регэксп, тем медленнее он будет обрабатываться... |
| Автор: smartov 25.4.2008, 23:24 | ||
Второе нет.
Ты меня за дебила считаешь? Я 10 минут потратил |
| Автор: bugmenot 29.5.2008, 15:04 |
| А ведь такой имейл тоже валидный: me@127.0.0.1 |
| Автор: maxbrown 17.6.2008, 19:13 | ||
Ээ... Граждане, а может, начать стоит с описания формата e-mail адреса по RFC822?
|
| Автор: Sanchezzz 25.6.2008, 11:13 |
| /\w+@\w+\.\w{2,6}/ |
| Автор: nerezus 12.7.2008, 14:11 |
| Sanchezzz, в рот тебе ноги. После стольких страниц постить такое Г... додумался блин... множесто нормальных рабочих мейлов такой "валидации" не выдержит. |
| Автор: americanets 14.7.2008, 16:55 |
| filter_var + FILTER_VALIDATE_EMAIL для php > 5.2 |
| Автор: smartov 14.7.2008, 17:38 |
| americanets, вротмненоги! Век живи век учись! Держи плюса. |
| Автор: unicross 17.1.2009, 15:04 |
| Русские буквы в адресе E-mail функция filter_var() считает допустимыми. На мой взгляд это косяк... E-mail привет@mail.ru врядли будет существовать... |
| Автор: theworldcreator 17.1.2009, 19:25 | ||
То-есть это — самая дотошная проверка? |
| Автор: unicross 17.1.2009, 21:09 | ||
theworldcreator, немного добавлю и кое-что изменю:
|
| Автор: theworldcreator 18.1.2009, 11:36 |
| Спасибо. Самым большим откровением стало отсутствие ё в перечисление а-я. Причем только что проверил — range('а', 'я') тоже его не включает. |