[Snippet] Check E-mail

Door Martijn , 20 jaar geleden, 8.354x bekeken

Met onderstaand snippet wordt een e-mail adres gecontroleerd. Deze wordt op meerdere factoren gevalideerd qua formaat. Dit script vraagt het domain niet op, en is daarom niet 100% waterdicht. Toch kun je ervan op aan dat hij alleen e-mail adressen toelaat met een geldige formattering.

Let op:
Ook komma's worden gezien als fouten, dit heb ik gedaan om tevens spam tegen te gaan, op deze manier wordt het adres alleen goedgekeurd als er maar 1 adres in staat. Dus als het mogelijk moet zijn om een e-mail naar meerdere adressen te sturen, moet het script worden aangepast.

Gebruik
Het is eenvoudig te gebruiken, je kunt dit bijvoorbeeld bovenaan je script plakken waar je het wilt gebruiken, maar ook includen, vervolgens pas je het zo toe:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?PHP
if(checkMail($mailadres))
{

    echo"Dit e-mail adres is goed";
}

else
{
   echo"Dit e-mail adres klopt niet";
}

?>

Gesponsorde koppelingen

PHP script bestanden

  1. snippet-check-email

 

Er zijn 23 reacties op 'Snippet check email'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
K i p
K i p
20 jaar geleden
 
0 +1 -0 -1
Paar puntjes:
Wat is er mis met [email protected]?Ik zie veel accolades in je script. Misschien is het leuk om bij sommige if's en/of for's geen accolades te gebruiken. Ik vind het zelf mooier staan, maar dit is puur wat je zelf wiltJe doet een paar keer het volgende in je for's:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
    for ( $i = 0 ; $i < sizeof ( $array ) ; $i++ )
?>
Naar mijn gevoel klopt dit niet. Ik denk dan dat PHP elke keer bij het begin van de loop de grootte van $array uitrekent. Dit lijkt mij traag, en daarom kan je het misschien beter zo doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
    for ( $i = 0 , $n = sizeof ( $array ) ; $i < $n ; $i++ )
?>
Dat rekent PHP maar 1 keer uit hoe groot $array is. (Denk ik…)Bij langere patterns zet ik graag de patterns eerst in een variabele, zodat de regel van ereg ( , $iets ) niet zo lang wordt:
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
39
40
<?php
    $pattern
= '#^[a-zA-Z0-9]{3,9}$#';
    if ( !ereg ( $pattern , $subject ) )
        
[
/code]Vind ik overzichtelijker.[/li]In totaal zou ik het dus zo doen: [code][code]<?php
    if ( !function_exists ( 'checkMail' ) )
    {
        function
checkMail ( $email )
        {

                if ( !ereg ( '^[^@]{1,64}@[^@]{1,255}$' , $email ) )
                    return false;
                    
                $email_array = explode ( '@' , $email );
                $local_array = explode ( '.' , $email_array [ 0 ] );
                
                $pattern = "^(([A-Za-z0-9!#$%&'*+/=?^_`{|}~-][A-Za-z0-9!#$%&'*+/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$";
                
                for ( $i = 0 , $n = sizeof ( $local_array ) ; $i < $n ; $i++ )
                    if ( !ereg ( $pattern , $local_array [ $i ] ) )
                        return false;
                
                if ( !ereg ( '^\[?[0-9\.]+\]?$' , $email_array [ 1 ] ) )
                {

                    $domain_array = explode ( '.' , $email_array [ 1 ] );
                    $domain_array_size = sizeof ( $domain_array );
                    
                    if ( $domain_array_size < 2 )
                        return false;
                    
                    $pattern = '^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$';
                    
                    for ( $i = 0 ; $i < $domain_array_size ; $i++ )
                        if ( !ereg ( $pattern , $domain_array [ $i ] ) )
                            return false;
                }
            }

            return true;
        }
    }

?>
Roderik Roderik
Roderik Roderik
20 jaar geleden
 
0 +1 -0 -1
nice script.
Martijn
Martijn
20 jaar geleden
 
0 +1 -0 -1
Bedankt voor je reactie Boris

Die accolades heb ik zo moeten aanleren toen ik begon met programmeren, en op deze manier vind ik het makkelijker om een overzicht te maken dat ook iedereen begrijpt (Het staat niet voor niets bij de beginners.)

Ik zie de sizeof wel redelijk vaak bij for-loops, ik kan me dus niet voorstellen dat dit zo is, maar ik ga het aanpassen, zodat we het in ieder geval zeker weten. Snelheid voor alles.

En omdat ik dit ook puur als snippet gebruik heb ik dus niet de lange strings in een variabele gezet, ik vond het niet nodig, en het overzicht blijft er wel mooi in (Als je tenminste geen wordwrap in je editor gebruikt).
PHP erik
PHP erik
20 jaar geleden
 
0 +1 -0 -1
Quote:
# Je doet een paar keer het volgende in je for's:
Selecteer deze code
1
2
3

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
    for ( $i = 0 ; $i < sizeof ( $array ) ; $i++ )
?>

Naar mijn gevoel klopt dit niet. Ik denk dan dat PHP elke keer bij het begin van de loop de grootte van $array uitrekent. Dit lijkt mij traag, en daarom kan je het misschien beter zo doen:
Selecteer deze code
1
2
3

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
    for ( $i = 0 , $n = sizeof ( $array ) ; $i < $n ; $i++ )
?>

Dat rekent PHP maar 1 keer uit hoe groot $array is. (Denk ik…)


PHP berekent sizeof($array) vóórdat de loop begint en zie het gewoon als waarde. Je oplossing is dus overbodig.
Mark Pieper
Mark Pieper
20 jaar geleden
 
0 +1 -0 -1
Waarom niet:
filter_var('[email protected]', FILTER_VALIDATE_EMAIL);
gebruiken?
Bo az
Bo az
20 jaar geleden
 
0 +1 -0 -1
Martijn:
Snelheid voor alles.

Waarom dan ereg en niet preg_match gebruiken ?

Maar vooral wat Boris ook vroeg:
Boris:
Wat is er mis met [email protected]?
Pim Vernooij
Pim Vernooij
20 jaar geleden
 
0 +1 -0 -1
@Mark: omdat dat PHP5.2+ is. Dat is nog maar op weinig servers beschikbaar.
Joeri
Joeri
20 jaar geleden
 
0 +1 -0 -1
en de mailadressen met een niet standaard extensie zoals de .museum domeinen???
en sommige andere correcte mailadressen laat hij ook niet door.
PHP Newbie
PHP Newbie
20 jaar geleden
 
0 +1 -0 -1
Boris,

Je hoeft niet te vertellen wat jij mooier vindt qua scripting, en al helemaal niet als het tegen de standaarden in gaat.

Deze manier is mooi en overzichtelijk, dat JIJ het niet mooi vindt doet er niet toe, want dan pas je het toch lekker aan ;-)

Ditzelfde geldt voor dat script van imagemagic, hou dit commentaar een beetje voor je, heeft niemand wat aan.



Over het script zelf, tsjah, ik denk dat je er met 1 goed regex patroon al wel bent, want nu krijg je dus problemen dat sommige valide e-mail adressen toch worden tegen gehouden.
Ed Wisseborn
Ed Wisseborn
20 jaar geleden
 
0 +1 -0 -1
Mooie gedaan. Kwam me wel bekend voor (vorige week nog ergens gezien) dus vraag me af of je niet beter de link kan doorgeven.
Martijn
Martijn
20 jaar geleden
 
0 +1 -0 -1
De basis is inderdaad van een ander, maar daar is echt heel weinig van over gebleven.

En ik zie nu idd dat [email protected] gewoon wordt goedgekeurd. Deze komt namelijk uit mijn snippets-archief, en aangezien ik dacht dat er voor de @ minstens 3 tekens moesten staan...zoals bij domainnamen, had ik dat dus nog in mijn hoofd zitten. Even codes door de war gehaald...

@PHPerik
Heb het weer terug veranderd...als het toch niet sneller is, dan is dat inderdaad een overbodige luxe.

@boaz
Heb er preg_match van gemaakt, ik wist niet dat dat sneller was, maar de PHP.net site zegt het...
PHP Newbie
PHP Newbie
20 jaar geleden
 
0 +1 -0 -1
Ook domeinen hoeven niet minstens 3 karakters te hebben hoor: www.aa.nl, www.aa.com
Hipska BE
Hipska BE
20 jaar geleden
 
0 +1 -0 -1
en wat dacht je vand deze site ;-) www.be

Edit:
de ubb parser nam hem eerst niet
Jacco Engel
Jacco Engel
20 jaar geleden
 
0 +1 -0 -1
@phpnewbie

Met de nieuwe SIDN regels moet een .nl dit in iedergeval wel (de laatste keer dat ik een .nl wou aanvragen.
Rudie dirkx
rudie dirkx
20 jaar geleden
 
0 +1 -0 -1
Waarom wil je ZO graag weten dat een adres klopt? Je kan met 1 regex controleren of een adres de juiste syntax heeft. Vind je functie een beeeetje overdreven. Als iemand een fout adres invult is het zn eigen schuld. Sowieso kan ie een fout adres invullen, daar doe je niks aan. Boeiend of de extensie .nl of .oele wordt gebruikt...
TJVB tvb
TJVB tvb
20 jaar geleden
 
0 +1 -0 -1
Het is wel zo gebruikersvriendelijk om het te controleren als die later nodig hebt, je sluit het zo niet helemaal uit maar wel voor een gedeelte.
Tevens voorkom je hier eventuele foutmeldingen mee bij het versturen van een mail
Eric Cartman
Eric Cartman
20 jaar geleden
 
0 +1 -0 -1
Quote:
Dat rekent PHP maar 1 keer uit hoe groot $array is. (Denk ik…)


Boris, Boris, Boris toch. Je weet toch best dat een $ teken in een variabele niet groen is maar ook gewoon blauw! :P
K i p
K i p
20 jaar geleden
 
0 +1 -0 -1
@PHPerik:
Quote:
PHP berekent sizeof($array) vóórdat de loop begint en zie het gewoon als waarde. Je oplossing is dus overbodig.
Dus dit is een oneindige loop?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
    $array
= array ( );
    while ( sizeof ( $array ) < 10 )
    {

        $array[] = 'hoi';
    }

?>
Legolas
Legolas
20 jaar geleden
 
0 +1 -0 -1
beste PHPErik, Boris heeft gelijk, zijn idee was wel een optimalisatie. Wellicht eentje die totaal geen netto effect heeft, maar hij had wel gelijk. Niet iets wat ik van hem gewend ben, maar goed, het komt blijkbaar wel eens voor.

Quote:
legolas@desky:~$ php -r "\$a = array(); for (\$i = 0; count(\$a) < 10; \$i++) { echo \$i; \$a[] = \$i; } echo \"\\n\";"
0123456789


Overigens is dit juist wel een rede om je niet aan te leren deze optimalisatie altijd te gebruiken want je zal juist wel eens een dynamisch geval hebben...
Elwin - Fratsloos
Elwin - Fratsloos
20 jaar geleden
 
0 +1 -0 -1
t vercetti schreef op 23.05.2007 12:32:
Waarom wil je ZO graag weten dat een adres klopt? Je kan met 1 regex controleren of een adres de juiste syntax heeft. Vind je functie een beeeetje overdreven. Als iemand een fout adres invult is het zn eigen schuld. Sowieso kan ie een fout adres invullen, daar doe je niks aan. Boeiend of de extensie .nl of .oele wordt gebruikt...
Dat is natuurlijk de grootst mogelijke poep die je nu loopt te verkopen. Als beheerder (of ontwikkelaar) van een website/applicatie moet je altijd je beste doen om foute input van een gebruiker te beperken. Meestal om de werking van je eigen applicatie te garanderen.

Elwin

[Edit: quotefix]
PHP erik
PHP erik
20 jaar geleden
 
0 +1 -0 -1
@Iedereen
sizeof() kun je gewoon direct in de loop doen, maar aangezien het hier meerdere keren wordt gebruikt op dezelfde array moet je het wel in een variabele doen ja. Ik had dat over het hoofd gezien omdat ik de code zelf niet erg overzichtelijk vind (anders dan ik gewend ben, ik hou van de PEAR standaard)
Ericbruggema x
ericbruggema x
19 jaar geleden
 
0 +1 -0 -1
Ik heb dit script net even getest maar zie dat je ook emails kunt valideren met bv

[email protected]

Echter is het volgens mij niet toegestaan om een domeinnaam extensie met een cijfer te hebben... of zit ik fout?
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Jurgen assaasas
Jurgen assaasas
19 jaar geleden
 
0 +1 -0 -1
In ga liever voor de ingebouwde PHP5 ingebouwde filters.

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

Inhoudsopgave

  1. snippet-check-email

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.