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.


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 : bazmega@kapa.com. 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.


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


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.


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

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 = "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";
}
?>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.