Как проверить адрес электронной почты в PHP? - PullRequest
115 голосов
/ 02 мая 2011

Как я могу проверить правильность введенного значения с помощью 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; 
     }    
} 

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

Ответы [ 6 ]

265 голосов
/ 02 мая 2011

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

filter_var($email, FILTER_VALIDATE_EMAIL)

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

function isValidEmail($email){ 
    return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}

Примечание : для других целей (где вам необходимо Regex) устаревшее семейство функций ereg (функции POSIX Regex) следует заменить насемейство preg ( Функции регулярных выражений PCRE ).Существует небольшое количество различий, поэтому достаточно прочесть Руководство.

Обновление 1 : Как указано @ binaryLV :

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

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

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

function isValidEmail($email) {
    return filter_var($email, FILTER_VALIDATE_EMAIL) 
        && preg_match('/@.+\./', $email);
}

Как указывало @ Eliseo Ocampos , эта проблема существует только до PHP 5.3, вВ той версии они изменили регулярное выражение , и теперь он выполняет эту проверку, поэтому вам не нужно.

9 голосов
/ 02 мая 2011

См. Примечания на http://www.php.net/manual/en/function.ereg.php:

Note:

Начиная с PHP 5.3.0, расширение регулярных выражений устарело в пользу расширение PCRE . Называя это функция выдаст E_DEPRECATED уведомление. См. список отличий за помощь при конвертации в PCRE.

Note:

preg_match () , который использует Perl-совместимое регулярное выражение синтаксис, часто быстрая альтернатива Эрегу ().

6 голосов
/ 10 ноября 2016

Это старый пост, но я поделюсь одним моим решением, потому что никто не упомянул здесь одну проблему раньше.

Новый адрес электронной почты может содержать символы UTF-8 или специальные доменные имена, такие как .live, .news и т. Д.

Также я нахожу, что какой-то адрес электронной почты может быть на кириллице, и во всех случаях стандартное регулярное выражение или 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 голосов
/ 12 февраля 2016

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

function validEmail($email){
    // First, we check that there's one @ symbol, and that the lengths are right
    if (!preg_match("/^[^@]{1,64}@[^@]{1,255}$/", $email)) {
        // Email invalid because wrong number of characters in one section, or wrong number of @ symbols.
        return false;
    }
    // Split it into sections to make life easier
    $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])) { // Check if domain is IP. If not, it should be valid domain name
        $domain_array = explode(".", $email_array[1]);
        if (sizeof($domain_array) < 2) {
            return false; // Not enough parts to domain
        }
        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;
}
1 голос
/ 20 марта 2019

Использование:

var_dump(filter_var('bob@example.com', FILTER_VALIDATE_EMAIL));
$validator = new EmailValidator();
$multipleValidations = new MultipleValidationWithAnd([
    new RFCValidation(),
    new DNSCheckValidation()
]);
$validator->isValid("example@example.com", $multipleValidations); //true
1 голос
/ 04 февраля 2017

Держитесь подальше от regex и filter_var() решений для проверки электронной почты. Смотрите этот ответ: https://stackoverflow.com/a/42037557/953833

...