Een e-mailadres valideren in PHP

Ik heb deze functie om een e-mailadres te valideren:

function validateEMAIL($EMAIL) {
    $v = "/[a-zA-Z0-9_-.+]+@[a-zA-Z0-9-]+.[a-zA-Z]+/";
    return (bool)preg_match($v, $EMAIL);
}

Is dit oké om te controleren of het e-mailadres geldig is of niet?


Antwoord 1, autoriteit 100%

De gemakkelijkste en veiligste manier om te controleren of een e-mailadres correct is ingevuld, is door de filter_var()functie:

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

Bovendien kunt u controleren of het domein een MX-record definieert:

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

Maar dit garandeert nog steeds niet dat de e-mail bestaat. De enige manier om daar achter te komen is door een bevestigingsmail te sturen.


Nu je een eenvoudig antwoord hebt, kun je gerust verder lezen over e-mailadresvalidatie als je meer wilt weten of gewoon het snelle antwoord gebruikt en verder gaat. Geen harde gevoelens.

Een e-mailadres proberen te valideren met een regex is een “onmogelijke” taak. Ik zou zelfs zo ver willen gaan om te zeggen dat die regex die je hebt gemaakt nutteloos is. Er zijn drie rfc’s met betrekking tot e-mailadressen en het schrijven van een regex om verkeerde e-mailadressen op te vangen en tegelijkertijd geen valse positieven hebben, is iets wat geen sterveling kan doen. Bekijk deze lijstvoor tests (zowel mislukt als geslaagd) van de regex gebruikt door PHP’s functie filter_var().

Zelfs de ingebouwde PHP-functies, e-mailclients of servers doen het niet goed. Toch is in de meeste gevallen filter_varde beste optie.

Als je wilt weten welk regex-patroon PHP (momenteel) gebruikt om e-mailadressen te valideren, ga dan naar de PHP-bron.

Als je meer wilt weten over e-mailadressen, raad ik je aan om de specificaties te lezen, maar ik moet je waarschuwen dat het niet gemakkelijk is om te lezen:

Merk op dat filter_var()zoals reeds vermeld alleen beschikbaar is vanaf PHP 5.2. Als je wilt dat het met eerdere versies van PHP werkt, kun je de regex gebruiken die in PHP wordt gebruikt:

<?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. Een opmerking over het hierboven gebruikte regex-patroon (van de PHP-bron). Het lijkt erop dat er copyright op rust van Michael Rushton. Zoals gezegd: “Voel je vrij om deze code te gebruiken en opnieuw te distribueren. Maar bewaar deze copyrightverklaring alsjeblieft.”


Antwoord 2, autoriteit 8%

U kunt hiervoor filter_vargebruiken.

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

Antwoord 3, autoriteit 2%

In mijn ervaring hebben regex-oplossingen te veel valse positieven en filter_var()-oplossingen hebben valse negatieven (vooral met alle nieuwere TLD’s).

In plaats daarvan is het beter om ervoor te zorgen dat het adres alle vereiste delen van een e-mailadres bevat (gebruiker, ‘@’-symbool en domein), en vervolgens te verifiëren dat het domein zelf bestaat.

Er is geen manier om te bepalen (serverzijde) of er een e-mailgebruiker bestaat voor een extern domein.

Dit is een methode die ik heb gemaakt in een klasse Utility:

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

Antwoord 4, autoriteit 2%

Ik denk dat je misschien beter af bent met PHP’s ingebouwde filters– in dit specifieke geval:

Het kan een waar of onwaar retourneren als het wordt geleverd met de parameter FILTER_VALIDATE_EMAIL.


Antwoord 5

Hiermee wordt niet alleen uw e-mailadres gevalideerd, maar ook ontsmet voor onverwachte tekens:

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

Antwoord 6

Beantwoord dit in ‘topvraag’ over e-mailverificatie https://stackoverflow.com/a/41129750/1848217

Voor mij is de juiste manier om e-mails te controleren:

  1. Controleer of het symbool @ bestaat, en ervoor en erna zijn er enkele niet-@ symbolen: /^[^@]+@[^@]+$/
  2. Probeer een e-mail naar dit adres te sturen met een “activeringscode”.
  3. Als de gebruiker zijn e-mailadres heeft “geactiveerd”, zullen we zien dat alles in orde is.

Natuurlijk kunt u een waarschuwing of knopinfo in de front-end weergeven wanneer de gebruiker
“vreemde” e-mail getypt om hem te helpen veelgemaakte fouten te voorkomen, zoals nee
punt in domeingedeelte of spaties in naam zonder aanhalingstekens enzovoort. Maar
je moet het adres “hello@world” accepteren als de gebruiker het echt wil.

Je moet ook onthouden dat de standaard voor e-mailadressen was en kan
evolute, dus je kunt niet één keer een “standaard geldige” regexp typen en
voor alle tijden. En je moet niet vergeten dat een of ander concreet internet
servers kunnen sommige details van de gemeenschappelijke standaard mislukken en in feite werken met
eigen “aangepaste standaard”.

Dus, check gewoon @, hint gebruiker op frontend en stuur verificatie-e-mails op het opgegeven adres.


Antwoord 7

Na het lezen van de antwoorden hier, kwam ik op dit uit:

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

Antwoord 8

Als u wilt, wanneer voorzien domein email adres te controleren geldig is, gebruik iets als:

/*
* 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)       
    }
}

Dit is een handige manier om veel ongeldige e-mailadressen te filteren, samen met standaard e-mailvalidatie, omdat een geldige e-mailindelingniet betekent een geldige e-mail.

Merk op dat idn_to_ascii()(of zijn zusterfunctie idn_to_utf8()) functie mogelijk nietbeschikbaar is in uw PHP-installatie, het vereist extensies PECL intl >= 1.0.2 en PECL idn >= 0.1.

Houd er ook rekening mee dat IPv4 of IPv6 als domeindeel in e-mail (bijvoorbeeld user@[IPv6:2001:db8::1]) niet kan worden gevalideerd, alleen benoemdhosts kunnen.

Bekijk hier.


Antwoord 9

Gebruik onderstaande code:

// Variable to check
$email = "[email protected]";
// Remove all illegal characters from email
$email = filter_var($email, FILTER_SANITIZE_EMAIL);
// Validate e-mail
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
  echo("Email is a valid email address");
} else {
  echo("Oppps! Email is not a valid email address");
}

Antwoord 10

Als u alleen op zoek bent naar een echte regex die verschillende punten, onderstrepingstekens en streepjes toestaat, gaat u als volgt te werk: [a-zA-z0-9.-]+\@[a-zA-z0-9.-]+.[a-zA-Z]+. Zo kan een nogal dom uitziende e-mail zoals tom_anderson.1-neo@my-mail_matrix.comworden gevalideerd.


Antwoord 11

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

Als je tegenwoordig een HTML5-formulier met type=emailgebruikt, ben je al voor 80% veilig omdat browser-engines hun eigen validator hebben. Om het aan te vullen, voegt u deze regex toe aan uw preg_match_all()en negeert u het:

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

Zoek de regex die wordt gebruikt door HTML5-formulieren voor validatie
https://regex101.com/r/mPEKmy/1

Other episodes