Email validatie snippet

Door Afra ca, 14 jaar geleden, 6.405x bekeken

Er zwerven op het wereldwijde web heel wat email validatie scripts rond, die ook prima functioneren. Zo was ook het script van Hipska (http://phphulp.nl/php/scripts/11/1622/) een tijd geleden heel prima.

Het viel me echter op dat een groot deel alleen op syntax controleerde, terwijl php speciale functies heeft om email te controleren op bestaan. Echter, bij de scripts die dit wel gebruikten, werd er vanuit gegaan dat dit ondersteund werd door de server. Daarom heb ik een iets flexibelere versie gemaakt, die op verschillende platformen en op verschillende php versies uitgevoerd kan worden.

Zoals eerder vermeldt, het gedeelte dat gebruikmaakt van checkdnsrr en getmxrr is afkomstig van Hipska. De preg_match is ook niet van mij afkomstig, die komt van php.net, user note van reportingsjr at gmail dot com bij de functie checkdnsrr.

Indien jullie opmerkingen hebben, houd het vriendelijk, dan blijven we allemaal vrolijk.

update: Heb zelf helaas geen host waar ik even een voorbeeld kan laten zien. Zal onder de code eventjes laten zien hoe je het zelf kan testen.

update2: Even een fix, had achter een return geen ; staan, shame on me....

update3: Jezpur wees op een veel logischere opbouw...... again, shame on me..

update4: Zoals Agirre zelf al vermoedde, is filter_var niet zo streng in het controleren als de preg_match. Zo zal test@test door filter_var gezien worden als valid, en de preg_match niet. Daarom is in dit geval gekozen om niet gebruik te maken van filter_var.

Update5: (final update hopelijk). Ik stel Agirre toch in zijn gelijk dat filter_var volstaat hier. Toch zullen beide versies hier blijven staan, maar de functie met preg_match zal vermeld worden als "oud".

Gesponsorde koppelingen

PHP script bestanden

  1. email-validatie-snippet

 

Er zijn 14 reacties op 'Email validatie snippet'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
M Ypma
M Ypma
14 jaar geleden
 
0 +1 -0 -1
Leuke snippet, maar erg zonde om de else 2 keer te herhalen, dat is helemaal niet nodig!


14 jaar geleden
 
0 +1 -0 -1
Handig, ga hem dadelijk testen
Jesper Diovo
Jesper Diovo
14 jaar geleden
 
0 +1 -0 -1
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
function checkmail($email){

    /* Check OS script is executed on*/
    /* Checkdnsrr Windows support from php 5.3*/

    if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
        if (version_compare(PHP_VERSION, '5.3.0') === -1) {
            /* PHP version doesn't support getmxrr and checkdnsrr*/
            /* Syntax control function here*/

            if(preg_match('/^\w[-.\w]*@(\w[-._\w]*\.[a-zA-Z]{2,}.*)$/', $email)){
                return true;
            }

            else {
                return false;
            }
        }
    }


     /* PHP version higher or equal to 5.3.0*/
     /* Function by Hipska @ http://www.phphulp.nl/php/scripts/11/1622/ */

     if(preg_match('#.+@(?<host>.+)#',$email,$match) > 0 and getmxrr($match['host'],$mxhosts)){
          /* Found MX records*/
          
          $valid = false;

          /* Walkt through MX records for valid*/
          while($host = next($mxhosts) and !$valid){
              /* IPv4 or IPv6 will do*/
              $valid = checkdnsrr($host, 'A') or checkdnsrr($host,'AAAA');
          }

                
           return $valid;
     }

            
     /* No valid email --> no correct host name or no MX records found*/
     return false;
}

?>


Dat had ik er van gemaakt ;-). Iets korter.
Afra ca
Afra ca
14 jaar geleden
 
0 +1 -0 -1
edit: nevermind, is inderdaad veel logischer. Zal het even editen....
Mark PHP
Mark PHP
14 jaar geleden
 
0 +1 -0 -1
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
filter_var($email, FILTER_VALIDATE_EMAIL);
?>
Nog wat korter...

Zal wellicht wat minder precies zijn.
Afra ca
Afra ca
14 jaar geleden
 
0 +1 -0 -1
@ Agirre:

Wellicht zou je oplossing de regex kunnen vervangen, maar de checkdnsrr zeker niet. Tragisch dat de return value van filter_var nou niet echt ideaal is om mee te werken, m'n ternary wil niet meewerken.....
Richard van Velzen
Richard van Velzen
14 jaar geleden
 
0 +1 -0 -1
Het wordt pas interessant als je ook daadwerkelijk aan alle servers in de MX-records gaat vragen of het mailadres... Mailbaar is :-)
Johan M
Johan M
14 jaar geleden
 
0 +1 -0 -1
Bedankt voor het delen van deze snippet, ik maakte slechts gebruik van die ene regel met de preg_match()-functie, dus dit is een welkome uitbreiding!

Grz. Johan.
Mark PHP
Mark PHP
14 jaar geleden
 
0 +1 -0 -1
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
var_dump(filter_var('test@test', FILTER_VALIDATE_EMAIL));
?>
Geeft bij mij gewoon false hoor. En als je het returntype wilt veranderen kun je altijd nog een wrapper functie maken.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
function checkMail($input) {
  return false !== filter_var($input, FILTER_VALIDATE_EMAIL);
}

?>

Ik heb ooit eens ergens wat gebreken van filter_var() gelezen, maar kan het niet terugvinden. Volgens mij kon je die ook oplossen door wat flags te zetten als derde argument.

Verder vraag ik me af of je echt zover wilt gaan als het controleren van de dns. Als een user een ongeldig emailadres wil invullen, lukt dat toch wel. Bij applicaties zoals banken etc. kan ik me dat wel voorstellen, maar dan implementeer je altijd zoiets als emailbevestiging.

EDIT: je script kan trouwens nog wat netter door meteen een return voor lijn 10 te zetten.
Verder alles over de mogelijkheden van filter_var() hier.
Hipska BE
Hipska BE
14 jaar geleden
 
0 +1 -0 -1
return (filter_var($test,FILTER_VALIDATE_EMAIL)!=false) ? true : false;
LOL? Dus wanneer het true is return dan true en waneer het false is, return false? Dit lijkt me lekker nutteloos.

Ik zal dan hier nogmaals mijn verbeterde versie van uw scriptje hier plaatsen in plaats van in een PM..

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
function checkmail($email){
    
    $valid = false;
    
    /* Check OS script is executed on*/
    /* Checkdnsrr Windows support from php 5.3*/

    if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' and version_compare(PHP_VERSION, '5.3.0') === -1) {
        /* PHP version doesn't support getmxrr and checkdnsrr*/
        /* Syntax control function here*/

        $valid = filter_var($email, FILTER_VALIDATE_EMAIL) != false;
    }

    
    /* WIN PHP version higher or equal to 5.3.0*/
    /* Function by Hipska @ http://www.phphulp.nl/php/scripts/11/1622/ */

    elseif(preg_match('#.+@(?<host>.+)#',$email,$match) > 0 and getmxrr($match['host'],$mxhosts)){
        /* Found MX records*/
        
        /* Walkt through MX records for valid*/

        while($host = next($mxhosts) and !$valid){
            /* IPv4 or IPv6 will do*/
            $valid = checkdnsrr($host, 'A') or checkdnsrr($host,'AAAA');
        }
    }

    
    /* No valid email --> no correct host name or no MX records found*/
    return $valid;
}


?>


Nu zie je veel duidelijker wanneer hij welke code uitvoert als er maar 1 return instaat.
Afra ca
Afra ca
14 jaar geleden
 
0 +1 -0 -1
Oude versie, had het in de preg_match versie al verbeterd zoals je kan zien.

Leuke is dat filter_var een string returned of false, maar aangezien het een versie zonder checkdnsrr bevat, en mét, kan je dus false, true en een string als return terug krijgen. Lijkt me dus niet een ideale situatie....
Hipska BE
Hipska BE
14 jaar geleden
 
0 +1 -0 -1
Neem dan mijn versie, die doet echt niet strings returnen..

Waarom de uwe dat zou doen is mij echt een raadsel :-S
Afra ca
Afra ca
14 jaar geleden
 
0 +1 -0 -1
edit: Mijn fout, zag je != false over het hoofd. Zal het zo fixen.

En je mag gewoon jij zeggen, zeker gezien ik mijzelf nog jong mag noemen.
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Roel -
Roel -
13 jaar geleden
 
0 +1 -0 -1
Ik snap het niet echt meer. Werkt dit niet op alle emailadressen? Ik heb het bij mijn bestaande hotmail adres geprobeerd en op mijn bestaande domeinnaam geprobeerd en twee keer invalid.

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. email-validatie-snippet

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.