Проверка e-mail

Этот урок покажет, как осуществить проверку e-mail. Когда вы регистрируетесь на сайте, как правило, ваш e-mail проверяется на верность введенного формата. Это делается с помощью регулярных выражений. Что нам нужно сделать, так это проверить строку (например, $email) на совпадение с регулярным выражениям:

ereg("^[a-zA-Z0-9_]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$]", $email);

На данный момент происходит только проверка строки ($email), и абсолютно ничего не выводится. Следующим шагом будет написание IF утверждения, которое будет возвращать булевое значение, если строка не будет совпадать с регулярными выражениями.

if (eregi("^[a-zA-Z0-9_]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$]", $email))
{
return FALSE;
}

Это основная часть проверки, но теперь мы можем её улучшить. Мы проверим доменное имя, которое находится после символа @: используем MX-запись и, если 25 порт открыт, то будем считать, что домен существует.

list($Username, $Domain) = split("@",$email);
if(getmxrr($Domain, $MXHost))
{
return TRUE;
}
else
{
if(fsockopen($Domain, 25, $errno, $errstr, 30))
{
return TRUE;
}
else
{
return FALSE;
}
}

Теперь, чтобы закончить урок, мы соединим эти 2 части кода в одну функцию, чтобы мы смогли ей воспользоваться многократно. Если вы не понимаете код, то проигнорируйте все, что было сказано выше, и просто скопируйте этот код:

function checkEmail($email)
{
if(eregi("^[a-zA-Z0-9_]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$]", $email))
{
return FALSE;
}

list ($Username, $Domain) = split («@»,$email);

if (getmxrr ($Domain, $MXHost))
{
return TRUE;
}
else
{
if (fsockopen ($Domain, 25, $errno, $errstr, 30))
{
return TRUE;
}
else
{
return FALSE;
}
}
}

Это все, что нам необходимо. Чтобы проверить e-mail, вызываем следующую функцию:

if(checkEmail(mail@example.com) == FALSE)
{
echo "E-mail не верный";
}
else
{
echo "E-mail верный";
}

Это все. Вы можете заменить mail@example.com на любой, какой вам нравится.

David Duke
Перевод: http://www.4webmaster.ru/

Рекомендуем почитать:
Стильные курсоры
Особенности ссылок «вверх страницы»
Генератор паролей


12 комментариев

  1. burik 28.10.2009

    Слишком слабо, чтобы называться уроком.

    Во-первых, разве нельзя до символа «@» использовать точки в адресах электронной почты? С такой проверкой email abc.def@mail.ru будет неверным.

    Во-вторых, зачем писать шаблон [a-zA-Z] в функцию eregi? Ведь она регистронезависима.

    В-третьих, по-вашему вызов подобный функции:

    checkEmail (mail@example.com)

    вернет что-то кроме ошибки? Тогда вы ошибаетесь, потому как нужно писать так: checkEmail («mail@example.com»)

  2. grigor 02.11.2009

    вот если кто скажет

    почему на адреса типа

    some@mail.ru

    проверка не идёт

    а на

    @gmail.com

    идёт

    то буду рад

  3. burik 10.11.2009

    Потому что функция написана настолько криво, что возращает значение прямо противиположное нужному. Точнее регулярное выражение отсекает все правильные адреса. Т.к. eregi вернет true в случае успешной проверки, а в примере в этом случае функция возращает false

  4. Aravak 26.11.2009

    А не проще ли обойтись без регулярных выражений, как например тут js-php.ru/web-development... -without-regexp/

  5. Tirei 12.03.2010

    if (eregi ([a-z0-9]«@», $email)) {

    echo «Все путем»;

    }

    else{

    echo «idika tu nahui»;

    }

    Чесно говоря у меня не заработал ващ код, я накидал свой, так что бы был.

    ВОТ потестил без @ и если будут русские символы посылает, аесли с @ и латинскими и цифрами и даже если есть точка все нормально.

  6. Blackheard 10.06.2010

    Если по написанию 'list ($U, $Dom) = split ('@', 'mail@example.com')' в переменную $Dom массива вернется example.com

    Разве можно через fsockopen зайти в example.com на 25 port??????????. НЕЛЬЗЯ. Токо с приставкой что-то типа smtp.

    А лучше взять 80 порт

    P.S Действительно через ж... написано

  7. Злобный глухой слон 07.07.2010

    Блин, горе программисты. Я еще могу понять, когда такие вещи пишут на perl или JS. Там как бы без вариантов. Но зачем? _ЗАЧЕМ_ делать такие вещи на PHP?

    Или религия не позволяет изучить язык?

    $mail = filter_var ($mail, FILTER_VALIDATE_EMAIL);

  8. Вася 13.07.2010

    if (!eregi («^[a-zA-Z0-9_]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$», $email))

    {

    ошибка ввода емейла

    }else{

    все прально

    }

    Вот так вроде работает прально

  9. anton 02.10.2010

    — Злобный глухой слон

    Спасибо !Огромненьшее...)))

  10. Steadfast 28.12.2010

    Злобный глухой слон, молодца!

    Автору поста спасибо за первую позицию в Google.

  11. Прохожий 12.05.2012

    А вот пользоваться функцией eregi — моветон. Ибо она уже в статусе depricated — устаревшая? может быть выкинута из функионала в любой из следующих версий php/ Учите матчасть и код пишите сами!

  12. Homez 25.07.2012

    Делаю сейчас регистрацию по e-mail для своего личного сайта, так что валидация e-mail интересовала. Код из этой статьи не пошел. А вот Злобному глухому слону — огромное спасибо! Его вариант хорошо работает!

    Постепенно обрастаю новыми знаними по PHP:)

Оставить комментарий: