Перейти к содержимому


Партнерская программа Kredov

Как проверить email-адрес на правильность?

#1 RussiaStudent

RussiaStudent
  • Пользователь
  • 19 сообщений
  • Репутация: 0
0

Отправлено 26 Июнь 2009 - 14:27

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

В интернете нашёл вот такой вариант
|([a-z0-9_\.\-]{1,20})@([a-z0-9\.\-]{1,20})\.([a-z]{2,4})|is
Но не могу его разобрать, что и как здесь?
Заранее благодарен. Жду помощи.

 

 

  • 0

#2 v1ex

v1ex
  • Пользователь
  • 225 сообщений
  • Репутация: 0

Отправлено 26 Июнь 2009 - 14:35

1) http://phpclub.ru/de...rticle/regexp_1
2) http://phpclub.ru/de...rticle/regexp_2
Читаем и разбираемся.
  • 0

#3 Banderas

Banderas
  • Пользователь
  • 1 168 сообщений
  • Репутация: 1

Отправлено 26 Июнь 2009 - 14:55

Хз, можно попробовать вот такую, но сам не знаю рабочая ли она....
function checkmail($m) {
	 $gav = strpos($m, '@');
	 $point = strtpos($m, '@');
 return (
	 $gav !== false &&
	 $point !== false &&
	 $point - $gav >= 3
		  );
}

  • 0


#4 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 27 Июнь 2009 - 12:11

Banderas, Во первых не правильно функция написана
Как минимум так:
$gav = strpos($m, '@');
	 $point = strtpos($m, '.');

Но тут всплывает самая здостная ошибка, которая не предвидится...
Попробуй как вот такой email адрес: mynik.admin@mail.ru
Всё, скрипт остановится на первой точке, что уже гарантированно будет неверно.

Так же не учтено, что до @ можно вводить только определённые символы. Например в адресе ты никогда не увидишь ~!"#$%&* это всё должно исключаться моментом. Твой же скрипт не осуществляет подобного в действительности.
Поэтому го сразу отсекаем.

RussiaStudent,
Я попробую расписать :lol: Сам давно регулярками не занимался.
|([a-z0-9_\.\-]{1,20})@([a-z0-9\.\-]{1,20})\.([a-z]{2,4})|is
И так:
Всё что находится между | И | регулярное выражение. is в конце это два модификатора

i (PCRE_CASELESS)

Если этот модификатор используется, символы в шаблоне соответствуют символам как верхнего, так и нижнего регистра.

s (PCRE_DOTALL)

Если данный модификатор используется, метасимвол "точка" в шаблоне соответствует всем символам, включая перевод строк. Без него - всем, за исключением переводов строк. Этот модификатор эквивалентен записи /s в Perl. Класс символов, построенный на отрицании, например [^a], всегда соответствует переводу строки, независимо от наличия этого модификатора.

Начнём разбирать само регулярное выражение:

Всё что находится между () называется содержимым кармана. Эти карманы нумеруются слева на права от 1 до количества этих корманов.

Расcмотрим первый карман:
Он соответствует названию почтового ящика
([a-z0-9_\.\-]{1,20})
[a-z0-9_\.\-] - означает что в строке может встретиться символ английского алфавита от a до z как в верхнем так и в нижнем регистре, может встретиться число от 0 до 9, а так же символы "_", "." и "-"
Некоторые символы не случайно предварены символом \ - экранировки. Он исключает возможность использования символов в качестве управляющих.
{1,20} - означает что последовательность данной строки колеблется от 1 до 20 символов.

Далее после первого кармана идёт символ @ - как говорится, сабака она и в африке сабака xD

Расcмотрим второй карман:
Он соответствует имени службы предоставляющей почту.
([a-z0-9\.\-]{1,20})
Всё то же самое что и в первом, только нет присутствия символа "_"

Далее после второго кармана идёт символ ., он пециально предварён \ - экранировка.

Расcмотрим третий карман:
Он соответствует зоне
([a-z]{2,4})
[a-z] - означает что в строке может встретиться символ английского алфавита от a до z как в верхнем так и в нижнем регистре.
{2,4} - означает что последовательность данной строки колеблется от 2 до 4 символов.

----------------------------------------------------------------
Подведём итог:
Данное регулярное выражение не идеально, так как не имеет начала и конца. Тоесть до имени почтового ящика можно вставить любую последовательность символов и после так же можно вставить. 20 символов для службы предоставляющей услуги почты, это слишком много...
  • 0

#5 RussiaStudent

RussiaStudent
    Topic Starter
  • Пользователь
  • 19 сообщений
  • Репутация: 0

Отправлено 27 Июнь 2009 - 18:49

Спасибо всем большое за ответы.

ZiTosS, а вообще данный способ можно использовать для проверки email адресов и как это сделать?
Буду очень признателен.
  • 0

#6 Banderas

Banderas
  • Пользователь
  • 1 168 сообщений
  • Репутация: 1

Отправлено 28 Июнь 2009 - 00:06

2*ZiTosS* Согласен с тобой. Только седня днем прочитал о регулярных выражениях и примерно понял как их использовать :lol: Мою функцию можно усовершенствовать, но в этом нет потребности...
Попробую напечатать свой код(может быть неверным, но у меня пашет:( ):
^[a-z0-9_\.\-]+@[a-z0-9\.\-]+\.[a-z0-9\-\.]
Правильный код переписан с книги:
^[a-zA-Z0-9_\-\.]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\.\-]+$
Как использовать приведённый выше код? С помощью функции eregi(), которая ищет соответствие, указанные в 'symbols', в строке $string, а результат выдает в виде масива $matches. eregi() отличается от ereg() только чувствительностью к регистру.
eregi('symbols', $string, $matches)
На деле:
if (!eregi('^[a-zA-Z0-9_\.\-]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\.\-]+$', $email)) {
	echo 'Электронный адрес некорректный!';
	exit;
}  
	else 
{
	echo 'Все правильно!';
}

  • 0


#7 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 28 Июнь 2009 - 10:36

Banderas,
Твой пример конечно рабочий. Но я могу ввести почтовый ящик с зоной больше 100 символов... Разве такое возможно? xD
У тебя нет ограничений на количество символов. А вот то что ограничил строку ^ и $ это правильно.
Пример показал верный.
  • 0

#8 artyom

artyom
  • Пользователь
  • 7 сообщений
  • Репутация: 0

Отправлено 25 Июль 2009 - 17:34

по RFC
(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru