Подтвердить что ты не робот

Как проверить электронную почту на 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; 
     }    
} 

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

4b9b3361

Ответ 1

Вы можете использовать функцию 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:

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

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

Обновление 2. Этот метод, конечно, будет проверять [email protected] как действительный адрес электронной почты, потому что на самом деле это действительный адрес электронной почты. Но большую часть времени в Интернете вы также хотите, чтобы адрес электронной почты имел TLD: [email protected]. Как было предложено в этом сообщении (ссылка отправлена ​​@Istiaque Ahmed), вы можете augment filter_var() с регулярным выражением, которое будет проверять наличие точки в части домена (не будет проверять действительный TLD):

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

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

Ответ 2

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

Note:

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

Note:

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

Ответ 3

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

Новый адрес электронной почты может содержать символы 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;
        }
    }
}

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

Ответ 4

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

function validEmail($email){
    // First, we check that there 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;
}

Ответ 5

Держитесь подальше от regex и filter_var() решений для проверки электронной почты. См. Этот ответ: fooobar.com/info/1290/...