Jak zweryfikować wiadomość e-mail w PHP?

Jak mogę zweryfikować wartość wejściową jest poprawny adres e-mail za pomocą php5. Teraz używam tego kodu

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; 
     }    
} 

Ale pokazuje przestarzały błąd. Jak mogę rozwiązać ten problem. Proszę, pomóż mi.

Author: hakre, 2011-05-02

5 answers

Możesz użyć funkcji filter_var(), która daje wiele przydatnych opcji walidacji i dezynfekcji.

filter_var($email, FILTER_VALIDATE_EMAIL)

Jeśli nie chcesz zmieniać kodu, który opiera się na funkcji, po prostu zrób:

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

Uwaga: W przypadku innych zastosowań (gdzie potrzebujesz wyrażenia Regex), przestarzała rodzina funkcji ereg (funkcje Regex POSIX) powinna zostać zastąpiona przez rodzinę preg (funkcje regex PCRE ). Istnieje niewielka ilość różnic, lektura podręcznika powinna wystarczyć.

Update 1: Jak zauważył @ binaryLV:

PHP 5.3.3 i 5.2.14 miały błąd związany z FILTER_VALIDATE_EMAIL, co spowodowało segfault podczas walidacji duże wartości. Proste i bezpieczne obejście tego problemu polega na użyciu strlen() przed filter_var(). Nie jestem pewien co do 5.3.4 final, ale jest napisali, że niektórzy 5.3.4-dotyczy to również wersji migawkowych.

Ten błąd został już naprawiony.

Update 2: ta metoda oczywiście potwierdzi bazmega@kapa jako poprawny adres e-mail, ponieważ w rzeczywistości jest to prawidłowy adres e-mail. Ale przez większość czasu w Internecie, chcesz również, aby adres e-mail miał TLD: [email protected]. Jak sugerowano w tym blogu post (link wysłany przez @ Istiaque Ahmed), można rozszerzyć filter_var() z regex, który sprawdzi istnienie w tym celu należy skontaktować się z Działem obsługi klienta pod adresem .]}

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

Jak @Eliseo Ocampos zauważył, ten problem istnieje tylko przed PHP 5.3, w tej wersji zmienili regex i teraz to sprawdza, więc nie musisz.

 254
Author: kapa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:26

Zobacz notatki na http://www.php.net/manual/en/function.ereg.php :

Note:

Od wersji PHP 5.3.0 rozszerzenie regex jest przestarzałe na rzecz rozszerzenie PCRE . Calling this funkcja wyda E_DEPRECATED Uwaga. Zobacz listę różnic pomoc przy konwersji na PCRE.

Note:

Preg_match () , która używa wyrażenia regularnego zgodnego z Perlem składni, jest często szybszą alternatywą na ereg ().

 9
Author: Sean Kelleher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-02 10:10:37

To jest stary post, ale podzielę się jednym z moich rozwiązań, ponieważ nikt tu nie wspomniał o jednym problemie wcześniej.

Nowy adres e-mail może zawierać znaki UTF-8 lub specjalne nazwy domen, takie jak .live, .news itd.

Również uważam, że niektóre adres e-mail może być w cyrylicy i we wszystkich przypadkach standardowe regex lub filter_var() nie powiedzie.

Dlatego zrobiłem dla niego rozwiązanie:

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;
        }
    }
}

Ta funkcja działa doskonale dla wszystkich przypadków i formatów e-mail.

 4
Author: Ivijan Stefan Stipić,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-16 18:27:15

Zawsze używam tego:

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;
}
 3
Author: unbreak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-12 10:12:25

Trzymaj się z dala od rozwiązań regex i filter_var() do walidacji wiadomości e-mail. Zobacz tę odpowiedź: https://stackoverflow.com/a/42037557/953833

 1
Author: Jabari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:21