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

Ошибка построения модели и контроллера в моем проекте веб-сайта

Что такое Reddit и как им пользоваться: описание сайта и регистрация
Web

Что такое Reddit и как им пользоваться: описание сайта и регистрация

Web

Проверка связи с определенным портом

Web

Как использовать str_replace, чтобы она действовала только при первом совпадении