25. januar 2009 - 16:04Der er
15 kommentarer og 2 løsninger
Email validering i PHP
Hej.
Er der ind der kan komme med et eksempel på, hvordan man laver en email validering via preg_match()?
Nu ved jeg ikke hvilke tegn der er tilladte i emails, men jeg går udfra, at det er bogstaverne A-Z, tallene 0-9, -, _ og . (Ret mig endelig, hvis der er flere eller færre)
Hvordan kan man så lave en validering, hvor email adressen først og fremmest skal indeholde minimum 1 af de tilladte tegn, efterfulgt af et @. Derefter minimum 1 af de tilladte tegn, efterfulgt af et punktum. Til sidst, efter punktummet, skal der være mellem 2 og 5 tegn, og blandt disse tegn, må der kun være bogstaver samt 1 enkelt punktum.
Ja, en email validering der går helt i dybden. Jeg håber nogle kan hjælpe med, og give en forklaring på hvordan det hænger sammen.
Jeg har lige gennemtestet det, og fundet et par småfejl:
- Hvis det der kommer før @ er på 1 tegn, giver det fejl - Hvis det allerførste tegn er et tal giver det fejl - Hvis det allerførste tegn er et ikke-tilladt tegn, giver det OK (F.eks ") - Hvis det der kommer før @ kun består af punktummer, giver det fejl
Det ville super, hvis de kunne blive rettet ;)
Det haster heldigvis ikke, så kan sagtens vente til du får tid.
jeg plejer at gøre sådan her: if (preg_match("#^[^@\s]+@[^\s]+\.[a-z]+$#", $email)) echo "match!";
Den siger bare minimum et tegn før @ og minimum et efter og så et . og så et toplevel domæne. Du skal huske på at man nu har domæner med ÆØÅ og sådan noget, så det er efterhånden utrolig svært at vide om en email er korrekt, men med den her får du ihvertfald sorteret de mest dovne fra. Folk ved jo som regel også at hvis de indtaster fx "sjadjslkhfkds" og får en fejl, at de så bliver nød til at indtaste en rigtig email, og gider derfor ikke prøve at se om de kan indtaste noget der ikke er en email. Hvis de ikke gider give deres email skriver de nok alligevel bare test@test.dk.
Hvis du virkelig vil tvinge folk til at skrive en email, der overholder specifikationen for en email adresser, så kan du læse den her i punkt 3.4 Address Specification: http://www.faqs.org/rfcs/rfc2822.html
Det er rigtigt ja, at en person altid ville kunne skrive f.eks test@test.dk, hvis vedkommende ikke gider skrive sin egen. Men det vil ikke rigtig nytte noget, da der sendes en nødvendig mail til den angivne email adresse.
Email valideringen er blot for at personen ikke ved en fejl indtaster forkert, og samtidig for at holde dem væk, der for sjov lige skriver en ugyldig mail.
Men jeg er skam helt tilfreds med det xylene_free har lavet for mig. Jeg venter blot lige på, at jeg de fejl jeg har nævnt, bliver rettet :)
Hvis der står et punktum i starten eller slutningen af teksten, der er før @ så giver det fejl.
Og nogle ekstra fejl jeg fandt, som måske kan rettes:
Hvis - står først eller til sidst, i teksten der er efter @ og før .endelse, så giver det rigtigt. (Et domæne navn kan jo ikke hedde f.eks www.-hej.dk)
Hvis _ står først eller til sidst, i teksten der er efter @ og før .endelse, så giver det rigtigt. (Et domæne navn kan jo ikke hedde f.eks www._hej.dk)
Ja jeg er en smule krævende, men dette er forhåbenligt også det sidste jeg forlanger ;)
Og hvis du synes man kun må have 1 punktum i træk, men flere _ eller - i træk efter @, så: if (preg_match('/^[a-z0-9_\-+\.]+@[a-z0-9]+((\.|[_\-]+)[a-z0-9]+)*\.[a-z]{2,6}$/i', $string))
Den gældende standard for smtp og altså email-adresser (rfc 2821 -- google !-) stipulerer at _ingen_ udover mailhosten må validere endsige afvise nogetsomhelst, der står foran @-tegnet, så der skal man bruge * som kvantifikator istedet for + !o]
if (preg_match('/^[a-z0-9_\-+\.]*@[a-z0-9]+((\.|[_\-]+)[a-z0-9]+)*\.[a-z]{2,6}$/i', $string))
Jeg takker rigtig mange gange for jeres hjælp. Jeg synes xylene_free og tmi har fortjent pointene, så hvis i vil være så venlige, at lægge et svar =) ?
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.