PDA

Просмотр полной версии : Регулярные выражение



Mихаил
01.06.2009, 20:15
Привет, есть вопрос по регулярным выражением, немогу правильно сформулировать идею, следовательно покажу на примере.

Например нужно проверить ел. почтовый язык

[email protected]
Регулярка к ниму

[^0-9][a-z0-9_]+@[a-z_]*\.[a-z]*
Но если мыло будет

[email protected]
тогда как учесть всё поддоменны и то что корневой домен должен быть в пределах {1,3}?
Примеры на которые регульрное выражение должно совпадать


@freemail.memail.su
@light.mail.corporation.net
и т.д.

Но не должно с


@freemail....memail.su
@light.mail.domenru
@rambler.mail
и т.д.


Есть идеи как это можно реализовать? :rolleyes:

Mихаил
01.06.2009, 20:29
Есть еще грамадный и я предпологаю не ефективный способ

@[a-z_]*((\.)+[a-z]*)+\.([a-z][a-z])|(\2[a-z])$
Вроде подходит, вот только запись будет верна

@freemail....mail.su
как и

@freemail.mail.su
Только

@freemail.mail.com
уже не верно

сейчас распишу по цветам


@[a-z_]*((\.)+[a-z]*)+\.([a-z][a-z])|(\2[a-z])$
@freemail.mail.com

как видите домен com уже не входи в цепочку хотя указано что

([a-z][a-z])|(\2[a-z])
2 либо 3 символа и все это являетса окончанием строки

Притом запись вида

@freemail.com и @freemail.ru
уже невходит в цепочку

Как найти оптимальное решение?

LiFeCoSt
01.06.2009, 21:00
я вот такое пользую
if(!eregi("^[a-zA-Z0-9\._-]+@[a-zA-Z0-9\._-]+\.[a-zA-Z]{2,4}$",$email)) { непраавильный мыл }

Mихаил
01.06.2009, 21:21
я вот такое пользую
if(!eregi("^[a-zA-Z0-9\._-]+@[a-zA-Z0-9\._-]+\.[a-zA-Z]{2,4}$",$email)) { непраавильный мыл }

Проанализировал твой пример и получаетса что твоя регулярка тоже не подходит
так как на запись вида

[email protected]
тоже будет верный вариант, но у нас в начале число и много точек, что в реальном мыле не допустимо :search:

Mихаил
01.06.2009, 22:15
Немного добираюсь до истины

[^0-9][a-z0-9]+@[a-z0-9]+(\.{0,1}[a-z])*
[email protected]..
Лишнии точки не учитывает, но вот корневой домен должен быть от двух до трех символов. Подчеркнутый текст лишний, что нужно еще добавить в регулярку?

LiFeCoSt
01.06.2009, 22:32
скажи сколько ты подуровней хочешь что бы глотало ?

LiFeCoSt
01.06.2009, 22:35
проверил свой в действии:
[email protected] пролазит как правильный

а больше поддоменов я не видел

Guffy
01.06.2009, 23:33
[^0-9][a-z0-9]+@([a-z0-9]+\.)+[a-z]{2,4}
где-то так

Mихаил
02.06.2009, 00:47
проверил свой в действии:
[email protected] пролазит как правильный

а больше поддоменов я не видел

По твое регулярке там и [email protected] пролазит
Например kmx.ru там уровень входящих поддоменов не ограничен.
например
[email protected]

З.Ы. Просто хотелось получить оптимальный вариант для проверки региляркой мыла

Mихаил
02.06.2009, 00:49
[^0-9][a-z0-9]+@([a-z0-9]+\.)+[a-z]{2,4}
где-то так

Вот это вариан! Спс ;)

LiFeCoSt
02.06.2009, 13:55
[email protected] через мой тоже пролазило ... )

Syon
02.06.2009, 22:40
при наличии тырнета - попробовать запросить MX record :)

Mихаил
02.06.2009, 23:58
при наличии тырнета - попробовать запросить MX record :)

Вы о чем?

Guffy
03.06.2009, 00:09
шутит он так. пробить домен по днсу имеется ввиду. хотя в каждой шутке, как понимаешь...
вообще кури rfc822 на тему формата мыльного адреса.
и погугли regex test - нугуглиш кучу "проверяльщиков" выражений

Mихаил
03.06.2009, 00:59
...
и погугли regex test - нугуглиш кучу "проверяльщиков" выражений...

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

sleep-walker
03.06.2009, 09:07
Я вот так писал когда-то:
^[a-z][a-z0-9\.\_\-]{1,15}@([a-z][a-z\_\-]{1,6}\.){1,3}[a-z]{2,3}$

chups
03.06.2009, 14:47
[^0-9][a-z0-9]+@([a-z0-9]+\.)+[a-z]{2,4}
где-то так

[email protected] не проходит

У каждого свой вариант [a-z\d][a-z\d_.%-]*@([a-z\d][a-z\d-]*\.)+[a-z]{2,4}

Хотя решение уже давно есть:
http://docstore.mik.ua/orelly/perl3/cookbook/ch06_20.htm
Говоря по русски нет ни одного 100% подходящего варианта

Syon
03.06.2009, 15:14
Ну понятно что спрашивать DNS это не регексы.
Но у вас же стоит задача валидации мылоадреса.
Вам нужны потом записи типа [email protected] ?
Если подходят то нафига вообще верифаить ? :)
А если нет, то регексы тогда нафиг и вперед в DNS.

PS. Да, чуть было не забыл. Так вы тока домен пробъете. А вот на юзверя вам
100% варианта вообще никто не даст. Даже SMTP чек.

vagrand
17.06.2009, 08:38
ИМХО если хочеш реальную валидацию мыла - надо при регистрации отсылать на него письмо со ссылкой для подтверждения. Никакой регексп этого не заменит.
А вот если шибко навороченный регексп не пропуститт действительно существующее мыло - можно и юзера потерять.