Wie validiere ich eine E-Mail in PHP?

120

Wie kann ich überprüfen, ob der Eingabewert eine gültige E-Mail-Adresse mit PHP5 ist? Jetzt benutze ich diesen Code

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

aber es zeigt veralteten Fehler. Wie kann ich dieses Problem beheben? Bitte hilf mir.

Lerner
quelle
3
Die richtige Antwort wurde bereits gegeben, jedoch in Bezug auf das veraltete Problem: Die Verwendung von regulären POSIX-Ausdrücken (die eregieine Funktion von sind) ist veraltet. Verwenden Sie stattdessen PCRE .
Felix Kling
3
Übrigens ist Ihre Regex völlig falsch. Einige vollständig gültige Adressen werden von Ihrer Funktion als ungültig markiert. Das Filtern von E-Mail-Adressen mit einem regulären Ausdruck ist ein Albtraum.
Artefakt2
Sie sollten den RFC 822- Standard verwenden. Hier finden Sie einen guten Artikel zum Analysieren von E-Mail-Adressen in PHP , in dem dies erläutert wird.
KTA

Antworten:

274

Sie können die filter_var()Funktion verwenden, die Ihnen viele praktische Validierungs- und Desinfektionsoptionen bietet.

filter_var($email, FILTER_VALIDATE_EMAIL)

Wenn Sie Ihren Code, der sich auf Ihre Funktion stützt, nicht ändern möchten, gehen Sie einfach wie folgt vor:

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

Hinweis : Für andere Verwendungszwecke (bei denen Sie Regex benötigen) sollte die veraltete eregFunktionsfamilie (POSIX Regex-Funktionen) durch die pregFamilie ( PCRE Regex-Funktionen ) ersetzt werden. Es gibt ein wenig Unterschiede, das Lesen des Handbuchs sollte ausreichen.

Update 1 : Wie von @binaryLV hervorgehoben :

PHP 5.3.3 und 5.2.14 hatten einen Fehler im Zusammenhang mit FILTER_VALIDATE_EMAIL, der bei der Überprüfung großer Werte zu einem Segfault führte. Eine einfache und sichere Problemumgehung, die strlen() zuvor verwendet wurde filter_var(). Ich bin mir über 5.3.4 final nicht sicher, aber es steht geschrieben, dass auch einige 5.3.4-Snapshot-Versionen betroffen waren.

Dieser Fehler wurde bereits behoben.

Update 2 : Diese Methode wird natürlich bazmega@kapaals gültige E-Mail-Adresse validiert , da es sich tatsächlich um eine gültige E-Mail-Adresse handelt. Meistens im Internet soll die E-Mail-Adresse jedoch eine TLD haben : [email protected]. Wie in diesem Blog-Beitrag vorgeschlagen (Link von @Istiaque Ahmed ), können Sie filter_var()einen regulären Ausdruck hinzufügen , der das Vorhandensein eines Punkts im Domain-Teil überprüft (jedoch keine gültige TLD überprüft ):

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

Wie @Eliseo Ocampos betonte, besteht dieses Problem nur vor PHP 5.3. In dieser Version wurde der reguläre Ausdruck geändert, und jetzt wird diese Überprüfung durchgeführt, sodass Sie dies nicht tun müssen.

Kapa
quelle
4
+1 Das heißt, Sie möchten vielleicht erwähnen, dass dies nur in PHP 5.2.x und höher verfügbar ist. :-)
John Parker
5
@middaparka: Da das OP eine veraltete Nachricht erhält eregi, scheint es, dass er PHP 5.3 verwendet. Aber ja, es ist wichtig, es zu erwähnen (für andere).
Felix Kling
8
PHP 5.3.3 und 5.2.14 hatten einen Fehler ( bugs.php.net/52929 ) FILTER_VALIDATE_EMAIL, der zu Segfault führte, wenn große Werte überprüft wurden. Eine einfache und sichere Problemumgehung, die strlen()zuvor verwendet wurde filter_val(). Ich bin mir nicht sicher über 5.3.4 final, aber es steht geschrieben, dass auch einige 5.3.4-Snapshot-Versionen betroffen waren.
binaryLV
1
@binaryLV filter_valoder filter_var?
Istiaque Ahmed
3
@kapa, Eigentlich brauchst du nicht mehr, um nach einem Punkt im Domain-Teil zu suchen. Siehe svn.php.net/viewvc/php/php-src/branches/PHP_5_3/ext/filter/…
Eliseo Ocampos
9

Siehe die Hinweise unter http://www.php.net/manual/en/function.ereg.php :

Note:

Ab PHP 5.3.0 ist die Regex-Erweiterung zugunsten der PCRE-Erweiterung veraltet . Wenn Sie diese Funktion aufrufen, wird ein E_DEPRECATED-Hinweis ausgegeben. In der Liste der Unterschiede finden Sie Hilfe zur Konvertierung in PCRE.

Note:

preg_match () , das eine Perl-kompatible Syntax für reguläre Ausdrücke verwendet, ist häufig eine schnellere Alternative zu ereg ().

Sean Kelleher
quelle
7

Dies ist ein alter Beitrag, aber ich werde eine meiner Lösungen teilen, da hier noch niemand ein Problem erwähnt hat.

Neue E - Mail - Adresse kann wie UTF-8 - Zeichen oder spezielle Domain - Namen enthält .live, .newsusw.

Außerdem finde ich, dass einige E-Mail-Adressen kyrilisch und in allen Fällen Standard-Regex sein können oder filter_var()fehlschlagen werden.

Deshalb habe ich eine Lösung dafür gefunden:

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

Diese Funktion funktioniert perfekt für alle Fälle und E-Mail-Formate.

Ivijan Stefan Stipić
quelle
3

Ich benutze immer das:

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;
}
unbrechen
quelle
1
@unbreak Ich habe Ihren Code ausprobiert und festgestellt, dass wenn Sie eine E-Mail als übergeben, alex@.diese immer true zurückgibt, wenn es sich nicht um eine gültige E-Mail-Adresse handelt.
Subhajit
0

Benutzerdaten sind für einen guten Entwickler sehr wichtig. Fragen Sie also nicht immer wieder nach denselben Daten. Verwenden Sie eine Logik, um einige grundlegende Datenfehler zu korrigieren.

Vor der Validierung der E-Mail: Zuerst müssen Sie alle unzulässigen Zeichen aus der E-Mail entfernen.

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

Überprüfen Sie anschließend Ihre E-Mail-Adresse mit dieser filter_var()Funktion.

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

Zum Beispiel

<?php
$email = "[email protected]";

// 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";
}
?>
MUFAzmi
quelle