Web

Как проверить адрес электронной почты на корректность в PHP

Как я могу проверить, что вводимое значение является действительным адресом электронной почты, используя php5? Сейчас я использую следующий код:

function isValidEmail($email){ 

     $pattern = "^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$"; 

     if (eregi($pattern, $email)){ 

        return true; 

     }  else { 

        return false; 

     }    

} ,

но он показывает ошибку deprecated. Как я могу исправить эту проблему? Пожалуйста, помогите мне.

 

Ответ 1

Вы можете использовать эту  функцию filter_var(), которая дает вам множество удобных опций проверки и очистки.

filter_var($email, FILTER_VALIDATE_EMAIL)

  • Руководство PHP filter_var()

  • Доступно в PHP> = 5.2.0

Если вы не хотите изменять свой код, основанный на вашей функции, просто выполните:

function isValidEmail($email){ 

    return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;

}

Примечание . Для других целей (где вам нужен Regex) при использовании устаревшего семейства ereg функций (POSIX Regex Functions) следует заменить семейством pregPCRE Regex Functions). Есть небольшое количество отличий, достаточно прочитать Инструкцию.

Дополнение 1:

В PHP 5.3.3 и 5.2.14 была ошибка, связанная с FILTER_VALIDATE_EMAIL, которая приводила к segfault при проверке больших значений. Простой и безопасный способ решения этой проблемы – использовать strlen() перед вызовом filter_var(). Я не уверен насчет версии 5.3.4 final, но написано, что некоторые версии моментальных снимков 5.3.4 также были затронуты.

Эта ошибка уже исправлена.

Дополнение 2 : Этот метод, конечно, подтвердит bazmega@kapa как действительный адрес электронной почты, потому что на самом деле это действительный адрес электронной почты. Но чаще всего в Интернете вы также хотите, чтобы адрес электронной почты имел TLD: bazmega@kapa.com. Вы можете дополнить filter_var() регексом, который будет проверять наличие точки в доменной части (но не будет проверять наличие действительного TLD): 

function isValidEmail($email) {

    return filter_var($email, FILTER_VALIDATE_EMAIL) 

        && preg_match('/@.+\./', $email);

}.

 

Ответ 2

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

Новый адрес электронной почты может содержать символы UTF-8 или специальные доменные имена, такие как .live, .news и т.д. Также я обнаружил, что некоторые email адреса могут быть на кириллице и во всех случаях стандартный regex или filter_var() не работают.

Поэтому я создал решение для этого:

function valid_email($email) {

    if(is_array($email) || is_numeric($email) || is_bool($email) || is_float($email) || is_file($email) || is_dir($email) || is_int($email))

        return false;

    else {

        $email=trim(strtolower($email));

        if(filter_var($email, FILTER_VALIDATE_EMAIL)!==false) return $email;

        else {

            $pattern = '/^(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){255,})(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){65,}@)(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22))(?:\\.(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-+[a-z0-9]+)*\\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-+[a-z0-9]+)*)|(?:\\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\\]))$/iD';

            return (preg_match($pattern, $email) === 1) ? $email : false;

        }

    }

}.

Эта функция отлично работает для всех случаев и форматов электронной почты.

 

Ответ 3

Я всегда использую это:

function validEmail($email){

    // Сначала мы проверяем, что есть один символ @, и что длины правильные

    if (!preg_match("/^[^@]{1,64}@[^@]{1,255}$/", $email)) {

        // Письмо недействительно, потому что в одном разделе неверное количество символов или неверное количество символов @.

        return false;

    }

    // Разделите его на разделы, чтобы облегчить код

    $email_array = explode("@", $email);

    $local_array = explode(".", $email_array[0]);

    for ($i = 0; $i < sizeof($local_array); $i++) {

        if (!preg_match("/^(([A-Za-z0-9!#$%&'*+\/=?^_'{|}~-][A-Za-z0-9!#$%&'*+\/=?^_'{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$/", $local_array[$i])) {

            return false;

        }

    }

    if (!preg_match("/^\[?[0-9\.]+\]?$/", $email_array[1])) { // Проверьте, является ли домен IP. Если нет, то это должно быть действительное доменное имя

        $domain_array = explode(".", $email_array[1]);

        if (sizeof($domain_array) < 2) {

            return false; // Недостаточно частей для домена

        }

        for ($i = 0; $i < sizeof($domain_array); $i++) {

            if (!preg_match("/^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$/", $domain_array[$i])) {

                return false;

            }

        }

    }

    return true;

}.

 

Ответ 4

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

Перед проверкой адреса электронной почты: сначала удалите из электронной почты все недопустимые символы.

//Это удалит все недопустимые символы из адреса письма

$email = filter_var($email, FILTER_SANITIZE_EMAIL);

после этого подтвердите свой адрес электронной почты с помощью этой  функции filter_var().

filter_var($email, FILTER_VALIDATE_EMAIL)) // Чтобы подтвердить электронную почту

Например,

<?php

$email = "john.doe@example.com";

// Удалите все недопустимые символы из письма

$email = filter_var($email, FILTER_SANITIZE_EMAIL);

// Проверка электронной почты

if (filter_var($email, FILTER_VALIDATE_EMAIL)) {

    echo $email."действительный адрес электронной почты";

} else {

    echo $email." не является действительным адресом электронной почты ";

}

?>.

 

Схожие статьи

Web

Автоматическая смена картинок на CSS. Смена изображений по таймеру

Как создать грамотное оформление страницы 404 на собственном сайте
Web

Как создать грамотное оформление страницы 404 на собственном сайте

Web

Как узнать IP-адрес собеседника по скайпу? Пошаговая инструкция

Лучшие бесплатные платформы для создания сайтов без особых навыков
Web

Лучшие бесплатные платформы для создания сайтов без особых навыков

×