Як перевірити електронну пошту в PHP?


120

Як я можу перевірити вхідне значення - це дійсна адреса електронної пошти за допомогою 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; 
     }    
} 

але він показує застарілу помилку. Як я можу виправити це питання. Будь ласка, допоможи мені.


3
Правильна відповідь вже була дана, але щодо застарілої проблеми: Використання регулярних виразів POSIX (що eregiє функцією) застаріле. Замість цього використовуйте PCRE .
Фелікс Клінг

3
До речі, ваш регекс абсолютно невірний. Деякі цілком дійсні адреси будуть позначені як недійсні вашою функцією. Фільтрування адрес електронної пошти за допомогою регулярного вираження - це кошмар.
Артефакт2

Ви повинні використовувати стандарт RFC 822, і ось хороша стаття Розбір електронних адрес в PHP, яка пояснює це.
kta

Відповіді:


275

Ви можете скористатися filter_var()функцією, яка дає багато зручних варіантів перевірки та санітарії.

filter_var($email, FILTER_VALIDATE_EMAIL)

Якщо ви не хочете змінювати код, який покладався на вашу функцію, просто зробіть:

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

Примітка . Для інших застосувань (де вам потрібен Regex) eregсімейство застарілих функцій (POSIX Regex Functions) слід замінити pregсімейством ( PCRE Regex Functions ). Існує невелика кількість відмінностей, прочитати Посібник має бути достатньо.

Оновлення 1 : Як вказав @binaryLV :

У PHP 5.3.3 та 5.2.14 була помилка, пов’язана з FILTER_VALIDATE_EMAIL, що призвело до сегментації під час перевірки великих значень. Простий і безпечний спосіб вирішення цього питання використовується strlen() раніше filter_var(). Я не впевнений щодо 5.3.4 остаточного, але написано, що також було зачеплено деякі версії 5.3.4-знімків.

Цю помилку вже виправлено.

Оновлення 2 : Цей метод, звичайно, буде підтверджений bazmega@kapaяк дійсна адреса електронної пошти, оскільки насправді це дійсна адреса електронної пошти. Але велика частина часу в Інтернеті, ви також хочете, щоб адреса електронної пошти , щоб мати TLD: 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, в цій версії вони змінили регулярний вираз , і тепер він робить цю перевірку, так що вам не доведеться.


4
+1 З цього приводу ви можете зазначити, що це доступно лише у PHP 5.2.x та вище. :-)
Джон Паркер

5
@middaparka: Коли ОП отримує застаріле повідомлення eregi, схоже, він використовує PHP 5.3. Але так, важливо це згадати (для інших).
Фелікс Клінг

8
У PHP 5.3.3 та 5.2.14 була пов’язана помилка ( bugs.php.net/52929 ) FILTER_VALIDATE_EMAIL, що призвела до сегментації під час перевірки великих значень. Простий і безпечний спосіб вирішення цього питання використовується strlen()раніше filter_val(). Я не впевнений щодо 5.3.4 остаточного, але написано, що також було зачеплено деякі версії 5.3.4-знімків.
binaryLV

1
@binaryLV, filter_valабо filter_var?
Істіаке Ахмед

3
@kapa, насправді вам більше не потрібно перевіряти крапку в частині домену. Дивіться svn.php.net/viewvc/php/php-src/branches/PHP_5_3/ext/filter/…
Eliseo Ocampos

9

Дивіться примітки за адресою http://www.php.net/manual/en/function.ereg.php :

Note:

Згідно з PHP 5.3.0, розширення регулярного вираження застаріле на користь розширення PCRE . Виклик цієї функції видасть повідомлення E_DEPRECATED. Перегляньте список відмінностей для довідки щодо перетворення на PCRE.

Note:

preg_match () , який використовує сумісний з Perl синтаксис регулярного вираження, часто є швидшою альтернативою ereg ().


7

Це стара публікація, але я поділюсь своїм рішенням, оскільки ніхто раніше не згадував тут про одну проблему.

Нова адреса електронної пошти може містити 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

Я завжди цим користуюся:

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
@unbreak Я спробував ваш код і виявив, що якщо ви передаєте електронну пошту, alex@.то він завжди повертає справжнє місце, де це не дійсна адреса електронної пошти.
Subhajit



0

Дані користувача дуже важливі для хорошого розробника, тому не запитуйте знову і знову про ті самі дані, використовуйте певну логіку, щоб виправити основні помилки в даних.

Перед підтвердженням електронної пошти: спочатку потрібно видалити всі незаконні символи з електронної пошти.

//This will Remove all illegal characters from email
$email = filter_var($email, FILTER_SANITIZE_EMAIL);

після цього підтвердіть свою електронну адресу за допомогою цієї filter_var()функції.

filter_var($email, FILTER_VALIDATE_EMAIL)) // To Validate the email

Наприклад, наприклад

<?php
$email = "john.doe@example.com";

// Remove all illegal characters from email
$email = filter_var($email, FILTER_SANITIZE_EMAIL);

// Validate email
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo $email." is a valid email address";
} else {
    echo $email." is not a valid email address";
}
?>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.