wake-up-neo.net

So validieren Sie eine E-Mail-Adresse in PHP

Ich habe diese Funktion, um eine E-Mail-Adresse zu validieren:

function validateEMAIL($EMAIL) {
    $v = "/[a-zA-Z0-9_-.+][email protected][a-zA-Z0-9-]+.[a-zA-Z]+/";

    return (bool)preg_match($v, $EMAIL);
}

Ist dies in Ordnung, um zu überprüfen, ob die E-Mail-Adresse gültig ist oder nicht?

201
Cameron

Der einfachste und sicherste Weg, um zu überprüfen, ob eine E-Mail-Adresse korrekt ist, ist die Verwendung der Funktion filter_var() :

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    // invalid emailaddress
}

Zusätzlich können Sie prüfen, ob die Domain einen MX -Datensatz definiert:

if (!checkdnsrr($domain, 'MX')) {
    // domain is not valid
}

Dies garantiert jedoch nicht, dass die Mail existiert. Die einzige Möglichkeit, dies herauszufinden, besteht darin, eine Bestätigungsmail zu senden.


Nachdem Sie Ihre einfache Antwort erhalten haben, können Sie sich über die Überprüfung der E-Mail-Adresse informieren oder einfach die schnelle Antwort verwenden und fortfahren. Keine harten Gefühle.

Der Versuch, eine E-Mail-Adresse mit einem regulären Ausdruck zu validieren, ist eine "unmögliche" Aufgabe. Ich würde so weit gehen zu sagen, dass dieser Regex, den Sie gemacht haben, nutzlos ist. Es gibt drei RFCs in Bezug auf E-Mail-Adressen und das Schreiben eines regulären Ausdrucks, um falsche E-Mail-Adressen abzufangen und gleichzeitig keine falschen Positiven zu haben, ist etwas, das kein Sterblicher tun kann. Check out diese Liste für Tests (sowohl fehlgeschlagen als auch erfolgreich) des regulären Ausdrucks, der von der Funktion filter_var() von PHP verwendet wird.

Sogar die eingebauten PHP Funktionen, E-Mail-Clients oder Server machen es nicht richtig. In den meisten Fällen ist filter_var Die beste Option.

Wenn Sie wissen möchten, welches Regex-Muster PHP (derzeit) zur Validierung von E-Mail-Adressen verwendet wird, lesen Sie die PHP Quelle .

Wenn Sie mehr über E-Mail-Adressen erfahren möchten, empfehle ich Ihnen, mit dem Lesen der technischen Daten zu beginnen, aber ich muss Sie warnen, dass das Lesen in keiner Weise einfach ist:

Beachten Sie, dass filter_var() wie bereits angegeben nur ab PHP= 5.2 verfügbar ist. Falls Sie möchten, dass es mit früheren Versionen von PHP) funktioniert Sie könnten den regulären Ausdruck verwenden, der in PHP verwendet wird:

<?php

$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';

$emailaddress = '[email protected]';

if (preg_match($pattern, $emailaddress) === 1) {
    // emailaddress is valid
}

P.S. Ein Hinweis zum oben verwendeten Regex-Muster (aus der Quelle PHP). Es sieht so aus, als ob ein Copyright von Michael Rushton vorhanden ist. Wie gesagt: "Fühlen Sie sich frei um diesen Code zu verwenden und weiterzugeben. Bitte bewahren Sie diesen Copyright-Hinweis auf. "

526
PeeHaa

Sie können hierfür filter_var verwenden.

<?php
   function validateEmail($email) {
      return filter_var($email, FILTER_VALIDATE_EMAIL);
   }
?>
38
Cameron Martin

Nach meiner Erfahrung haben regex Lösungen zu viele falsche Positive und filter_var() Lösungen haben falsche Negative (insbesondere bei allen neueren TLDs ).

Stellen Sie stattdessen sicher, dass die Adresse alle erforderlichen Teile einer E-Mail-Adresse enthält (Benutzer, "@" - Symbol und Domäne), und stellen Sie dann sicher, dass die Domäne selbst vorhanden ist.

Es gibt keine Möglichkeit, (serverseitig) festzustellen, ob ein E-Mail-Benutzer für eine externe Domain vorhanden ist.

Dies ist eine Methode, die ich in einer Utility-Klasse erstellt habe:

public static function validateEmail($email)
{
    // SET INITIAL RETURN VARIABLES

        $emailIsValid = FALSE;

    // MAKE SURE AN EMPTY STRING WASN'T PASSED

        if (!empty($email))
        {
            // GET EMAIL PARTS

                $domain = ltrim(stristr($email, '@'), '@') . '.';
                $user   = stristr($email, '@', TRUE);

            // VALIDATE EMAIL ADDRESS

                if
                (
                    !empty($user) &&
                    !empty($domain) &&
                    checkdnsrr($domain)
                )
                {$emailIsValid = TRUE;}
        }

    // RETURN RESULT

        return $emailIsValid;
}
12
Jabari

Ich denke, Sie sind vielleicht besser dran, wenn Sie PHP verwenden Filter - in diesem speziellen Fall:

Es kann ein true oder false zurückgeben, wenn es mit dem FILTER_VALIDATE_EMAIL param.

9
Fluffeh

Dies überprüft nicht nur Ihre E-Mail, sondern bereinigt sie auch auf unerwartete Zeichen:

$email  = $_POST['email'];
$emailB = filter_var($email, FILTER_SANITIZE_EMAIL);

if (filter_var($emailB, FILTER_VALIDATE_EMAIL) === false ||
    $emailB != $email
) {
    echo "This email adress isn't valid!";
    exit(0);
}
8
Excalibur

Beantwortete dies in der 'obersten Frage' zur E-Mail-Bestätigung https://stackoverflow.com/a/41129750/1848217

Für mich ist der richtige Weg zum Abrufen von E-Mails:

  1. Stellen Sie sicher, dass das Symbol @ vorhanden ist und davor und danach einige [email protected] -Zeichen vorhanden sind: /^[^@][email protected][^@]+$/
  2. Versuchen Sie, eine E-Mail mit einem Aktivierungscode an diese Adresse zu senden.
  3. Wenn der Benutzer seine E-Mail-Adresse "aktiviert" hat, sehen wir, dass alles in Ordnung ist.

Natürlich können Sie im Front-End eine Warnung oder einen Tooltip anzeigen, wenn der Benutzer "seltsame" E-Mails eingibt, um häufige Fehler zu vermeiden, z. B. Punkte im Domain-Teil oder Leerzeichen im Namen ohne Anführungszeichen. Sie müssen jedoch die Adresse "hello @ world" akzeptieren, wenn der Benutzer dies wirklich möchte.

Sie müssen sich auch daran erinnern, dass der Standard der E-Mail-Adresse sich weiterentwickelt hat und weiterentwickelt werden kann, sodass Sie nicht einfach ein für alle Mal einen "standardgültigen" regulären Ausdruck eingeben können. Und Sie müssen bedenken, dass einige konkrete Internet-Server einige Details eines gemeinsamen Standards nicht erfüllen können und tatsächlich mit einem eigenen "modifizierten Standard" arbeiten.

Also einfach @ ankreuzen, Benutzer am Frontend ankreuzen und Bestätigungs-E-Mails an die angegebene Adresse senden.

2
FlameStorm

Wenn Sie nur nach einem regulären Ausdruck suchen, der verschiedene Punkte, Unterstriche und Striche zulässt, gehen Sie wie folgt vor: [a-zA-z0-9.-]+\@[a-zA-z0-9.-]+.[a-zA-Z]+. Das erlaubt eine ziemlich blöde E-Mail wie [email protected]_matrix.com zur Überprüfung.

1
smulholland2

Wenn Sie überprüfen möchten, ob die von angegebene Domain von der E-Mail-Adresse gültig ist, verwenden Sie Folgendes:

/*
* Check for valid MX record for given email domain
*/
if(!function_exists('check_email_domain')){
    function check_email_domain($email) {
        //Get Host name from email and check if it is valid
        $email_Host = explode("@", $email);     
        //Add a dot to the end of the Host name to make a fully qualified domain name and get last array element because an escaped @ is allowed in the local part (RFC 5322)
        $Host = end($email_Host) . "."; 
        //Convert to ascii (http://us.php.net/manual/en/function.idn-to-ascii.php)
        return checkdnsrr(idn_to_ascii($Host), "MX"); //(bool)       
    }
}

Dies ist eine praktische Methode zum Filtern vieler ungültiger E-Mail-Adressen sowie zur standardmäßigen E-Mail-Überprüfung, da gültiges E-Mail-Format nicht gültiges E-Mail bedeutet.

Beachten Sie, dass idn_to_ascii() (oder seine Schwesterfunktion idn_to_utf8()) function ist möglicherweise nicht verfügbar in Ihrer PHP Installation, Es sind die Erweiterungen PECL intl> = 1.0.2 und PECL idn> = 0.1 erforderlich.

Beachten Sie auch, dass IPv4 oder IPv6 als Domain-Teil in E-Mails (zum Beispiel [email protected][IPv6:2001:db8::1]) Nicht validiert werden kann, sondern nur named Hosts.

Sehen Sie mehr hier .

0
bodi0
/(?![[:alnum:]]|@|-|_|\.)./

Wenn Sie heutzutage ein HTML5-Formular mit type=email Verwenden, sind Sie bereits zu 80% sicher, da Browser-Engines über einen eigenen Validator verfügen. Um dies zu vervollständigen, füge diese Regex zu deiner preg_match_all() hinzu und negiere sie:

if (!preg_match_all("/(?![[:alnum:]]|@|-|_|\.)./",$email)) { .. }

Finden Sie den regulären Ausdruck, der von HTML5-Formularen zur Validierung verwendet wird
https://regex101.com/r/mPEKmy/1

0
Thielicious

Nachdem ich die Antworten hier gelesen hatte, kam ich zu folgendem Ergebnis:

public static function isValidEmail(string $email) : bool
{
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        return false;
    }

    //Get Host name from email and check if it is valid
    $email_Host = array_slice(explode("@", $email), -1)[0];

    // Check if valid IP (v4 or v6). If it is we can't do a DNS lookup
    if (!filter_var($email_Host,FILTER_VALIDATE_IP, [
        'flags' => FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE,
    ])) {
        //Add a dot to the end of the Host name to make a fully qualified domain name
        // and get last array element because an escaped @ is allowed in the local part (RFC 5322)
        // Then convert to ascii (http://us.php.net/manual/en/function.idn-to-ascii.php)
        $email_Host = idn_to_ascii($email_Host.'.');

        //Check for MX pointers in DNS (if there are no MX pointers the domain cannot receive emails)
        if (!checkdnsrr($email_Host, "MX")) {
            return false;
        }
    }

    return true;
}
0
Pelmered