Avatar billede htx98i17 Professor
12. april 2010 - 15:44 Der er 21 kommentarer og
1 løsning

2010 email validator søges

Jeg har søgt på email validator her på eksperten og jeg får 500 hits frem. Det er for uoverskueligt.

Jeg har brug for hjælp til at lave en rimelig simpel emailvalidator lavet med preg_match().

Adressen bliver også verificeret ved at der bliver sendt en mail til brugeren, så der skal blot tjekkes for det basale.

Men hvad er så det basale?

Tilladt:
0-9
a-z
A-Z
bindestreg
underscore
punktum

Obligatorisk:
mindt et tegn før @
mindst et tegn efter @
et @
et punktum efter @

Eller?

Er der nogen der vil? og samtidig forklare lige som ovenstående hvad der accepteres og hvad der ikke gør.
Avatar billede Slettet bruger
12. april 2010 - 16:47 #1
Mønster:
[0-9a-Z\-_\.]+@[0-9a-Z]+\.[a-Z]{2,}

Forklaring:
[0-9a-Z\-_\.]+
0-9, a-Z, "-", "_" og "." tillades FØR @-tegnet og der skal mindst være ét af de tilladte tegn.

[0-9a-Z]+
0-9 og a-Z tillades EFTER @-tegnet og der skal mindst være ét af de tilladte tegn.

[a-Z]{2,}
a-Z tillades EFTER det sidste punktum og der skal mindst være 2 af de tilladte tegn (dk, com, org, osv.)

Eksempel:
igor56@mydomain.com - OK
igor56@mydomain.c - IKKE OK, der SKAL være 2 bogstaver efter punktummet.

Desuden vil æ, ø og å ikke godkendes af ovenstående mønster.
Avatar billede Slettet bruger
12. april 2010 - 16:52 #2
Det kan også ændres så du tillader æ, ø og å, eller du kan angive præcis hvilke domain-typer (dk, com, osv.) der må tillades.
Et eksempel kunne være følgende mønster:
[0-9a-ZæøåÆØÅ\-_\.]+@[0-9a-ZæøåÆØÅ]+\.(?:dk|com|org)

Eksempler:
igør56@mydomain.dk - OK
igør56@my-domain.dk - IKKE OK, bindestreger i domænenavnet er ikke tilladt!
igør56@mydomain.dkk - IKKE OK, kun dk, com og org er tilladt!
Avatar billede htx98i17 Professor
12. april 2010 - 17:00 #3
tjekker den også om der er punktum efter @?

Der må gerne være æøå i emailadressen, men der skal ikke valideres på tld - så hvordan ser den så ud?
Avatar billede htx98i17 Professor
12. april 2010 - 17:03 #4
Og tillader den også bindestreg i domænenavn?
Avatar billede nemlig Professor
12. april 2010 - 17:12 #5
Du kan også tjekke om domænet eksisterer - altså den del, der står efter @. Herved får du aflusset en del fejlmuligheder.

if (function_exists("checkdnsrr")) {
if(checkdnsrr($host[1].'.', 'MX') ) return TRUE;
if(checkdnsrr($host[1].'.', 'A') ) return TRUE;
if(checkdnsrr($host[1].'.', 'CNAME') ) return TRUE;
} else { return TRUE;}
Avatar billede Slettet bruger
12. april 2010 - 17:23 #6
Jeg har givet dig et virkende mønster du kan bruge og så kan du selv rette i det efter behov, jeg vil ikke sidde og skræddersyge det til dig :-)

Så håber det er godt nok det jeg er kommet med!
Avatar billede htx98i17 Professor
12. april 2010 - 17:54 #7
I mit spørgsmål beder jeg om forklaring på hvad der accepteres og hvad der ikke accepteres. Det er jo bl.a. det som jeg vil give point for. Derfor spørger jeg om bindestreg og om punktum, fordi du ikke selv har skrevet det.
Avatar billede Slettet bruger
12. april 2010 - 18:23 #8
Quote fra første post
[0-9a-Z]+
0-9 og a-Z tillades EFTER @-tegnet og der skal mindst være ét af de tilladte tegn.


Quote fra anden post:
igør56@my-domain.dk - IKKE OK, bindestreger i domænenavnet er ikke tilladt!


Syntes selv jeg har forklaret mig, men det er jo ikke til at vide hvad du vil have når du kommer med så lidt info som du gør.
Du skal være glad for jeg overhovedet gad komme med et mønster og en forklaring dertil.
Normalt ville jeg og mange andre herinde på Eksperten ignorerer din post eller fortælle dig at du må komme med den kode, som du ikke har kunne få til at virke.

Så jeg siger igen, brug det mønster jeg er kommet med og ændrer det selv efter behov, eller kom med noget kode som vi kan arbejde med.
Avatar billede htx98i17 Professor
12. april 2010 - 18:37 #9
roxki jeg siger tak for din hjælp. Men fortæl ikke mig hvad andre på eksperten normalt gør. Jeg har trods alt været bruger her 4 år mere end du har :) Og det du fortæller er ikke korrekt. De ville ikke ignorere mit indlæg, de ville spørge "Har du noget kode at arbejde videre med?"

Og så ville jeg svare:

"Nej, jeg har ikke noget kode."

Og det er også svaret til dig, hvis du havde spurgt efter det. Men du sprang direkte videre til svineren.

Det er et spørgsmål til 100 point, hvilket fortæller lidt om hvor "nemt" spørgsmålet er at hjælpe med. Så må du da også forvente at at få uddybende spørgsmål. Specielt når du glemmer at svare på det jeg spørger om. Det med bindestregen havde jeg overset, men det med punktummet mener jeg ikke jeg har overset. Desuden kommer PHP med en fejl ved begge dine forslag. Så jeg kan ikke teste på det.

Jeg kan kun gætte på du har en dårlig dag. Det er i hvert sjældent jeg oplever brugere der springer direkte videre til svineren.

Tak for din hjælp. Lad nu andre komme til.
Avatar billede Slettet bruger
12. april 2010 - 18:46 #10
Det var nu ikke en sviner, men det er jo som man tager det :-)
Og igen, du siger der er fejl, men uden kode kan jeg desværre ikke komme med nogle bud på hvorfor der opstår fejl.
Avatar billede nemlig Professor
12. april 2010 - 20:19 #11
htx98i17: Som den "gamle erfarne rotte", du er her på Eksperten, bør du vide, at man ikke bare skriver "Desuden kommer PHP med en fejl ved begge dine forslag."
Så er det vel på sin plads, at du viser koden og beskriver fejlen, hvis du ønsker hjælp til dette (men det gør du måske ikke).
Og det er sikkert mig, der forkert på den, da du har været her på sitet 8 år mere end jeg.
Roxki's indlæg kan jeg ikke se er nogen "sviner". Det synes jeg er en ret hård "dom" til en venlig sjæl, der trods alt bruger tid på at hjælpe dig.
Du burde efter min opfattelse være lidt mere ydmyg.
Avatar billede htx98i17 Professor
12. april 2010 - 20:43 #12
roxki -> Jeg kommer gerne med fejlbeskrivelsen, men jeg skal jo først lige opdage den før det er muligt. Du var kommet med "svineren" inden jeg overhovedet havde testet koden. Og det var jo heller ikke fejlkoden du beklagede dig over ikke at have fået, da jeg ikke havde nævnt noget om at din kode ikke virkede på det tidspunkt, men en kode som jeg angiveligt selv burdehave startet ud med og det er jo det jeg siger at jeg ikke har.

I dette spørgsmål er jeg ikke selv startet med at prøve noget, som jeg normalt gør. Og det skal der være plads til. Hvis du ikke kan klare brugere som tillader sig det indimellem, så kan du vælge ikke at svare. Det gjorde du så alligevel og jeg kan se du har brugt tid på det. Tak for det. Men jeg må have lov at spørge uddybende ind til det du skriver. Det mener jeg at jeg har sat point af til at kunne tillade mig. Derfor skriver jeg til dig hvad opgaven/spørgsmålet går ud på, for at være sikker på at du har forstået det korrekt og ikke forventer at få 100 point fordi du tror du har besvaret spørgsmålet tilfredsstillende.

Men Roxki. Jeg vil som jeg skriver gerne give point til dem som besvarer mit spørgsmål. Som sagt, så havde jeg overset det med bindestreg. Men hvad med punktummet? Hvis jeg selv kunne se om der var taget højde for det, så ville jeg jo ikke spørge. Her på eksperten er det at man må spørge, og dem som vil svare for de point der er udlovet, kan vælge at hjælpe.
Avatar billede htx98i17 Professor
12. april 2010 - 20:52 #13
Fejlkoden er her:
Warning: preg_match() [function.preg-match]: Unknown modifier '+' in...

Og linjen ser således ud:
if(!preg_match('[0-9a-ZæøåÆØÅ\-_\.]+@[0-9a-ZæøåÆØÅ]+\.(?:dk|com|org)',$_POST['emailadresse'])) $arr_validering['emailadresse'] = 1;
Avatar billede Slettet bruger
12. april 2010 - 21:45 #14
Den fejlkode ud får er pga. du ikke har indsat delimiter-tegnene der skal stå rundt om regex mønstret.
Du vælger selv hvilket tegn du vil bruge som delimiter tegn rundt om mønstret, men jeg vil råde dig til at bruge et tegn som ikke bliver brugt inde i mønstret som f.eks. "#"
Du angiver delimiter tegnene på følgende måde:
preg_match("#mønster-her#");
Og nej der bliver ikke tjekket for punktummer i domænenavnet, så "subdomain.mydomain.dk" vil ikke blive godkendt af ovenstående mønster.
Hvis du vil have at man skal have lov til at bruge punktummer i domænenavnet så skal du ændre delen efter @-tegnet til følgende:
[0-9a-ZæøåÆØÅ\.]+

Håber jeg fik svaret på alle dine spørgsmål denne gang :-)
Avatar billede htx98i17 Professor
12. april 2010 - 21:56 #15
Der er lidt problemer med @'et

Den ser således ud nu

#^[^\w\d\-_\.æøåÆØÅ]@+^[^\w\dæøåÆØÅ\.\-_]\.[a-Z]{2,}$#

Compilation failed: range out of order in character class at offset 44
# 44 er @'et

Jeg har forsøgt at lave et \@ men det gør ingen forskel? hvad er det med det @?
Avatar billede htx98i17 Professor
12. april 2010 - 22:08 #16
Jeg troede det var @'et der var problemet da offset svarede til @'et.

Men nu prøvede jeg at lave den således:
#^[^\w\d\-_\.æøåÆØÅ]@^[^\w\dæøåÆØÅ\.\-_]#

og der kommer ingen fejl. Derimod lader den IKKE til at fungere som den skal :)

Jeg er i tvivl om jeg skal [^ altså finde alt der IKKE er tilladte tegn, eller om jeg skal finde tilladte tegn.
Avatar billede Slettet bruger
12. april 2010 - 22:20 #17
Du har lavet nogle ændringer i mønstret som er ret væsentlige for hvordan det kommer til at virke.
Jeg vil gennemgå mønstret fra start til slut.

# = delimiter start
^ = mønster start
[^\w\d\-_\.æøåÆØÅ] = match alt der IKKE er "word char", "decimal digit", -, _, ., æøå eller ÆØÅ - fjerner du derimod "^"-tegnet i starten af din bracket "[^" så vil den matche alt det jeg lige har opremset. Derudover har du flyttet rundt på "@" og "+" hvilket sagtens kan være grund for den fejl du får. "+"-tegnet betød at der skal mindst være 1 eller flere af de førnævnte tegn, hvorimod "@"-tegnet bare betyder der skal være et "@".
^ = Da det står udenfor brackets betyder det at det matcher starten af en linje, så derfor kan vi godt fjerne det tegn.
[^\w\dæøåÆØÅ\.\-_] = samme gælder for denne del, som den anden del i brackets, fjern "^"-tegnet og det vil få den ønskede virkning.
\. = matcher et punktum
[a-Z]{2,} = matcher a-z & A-Z med mindst. 2 tegn, dvs. "dk" og "com" er godtaget, men et enkelt bogstav såsom "k" ville ikke godtages.
$ = slutning på dit mønster
# = slutning på delimiter

Det var gennemgangen, her får du en modificeret udgave af det mønster du kom med:
#^[\w\d\-_\.æøåÆØÅ]+@[\w\dæøåÆØÅ\.\-_]\.[a-Z]{2,}$#

Håber det gav mening, da det hurtigt kan komme til at lige noget være rod.
Avatar billede htx98i17 Professor
12. april 2010 - 22:33 #18
Jep jeg forstår din forklaring og hvordan der er system i rodet.

Den modificerede kommer desværre stadig med fejl:
Compilation failed: range out of order in character class at offset 42

Jeg har tilføjet et +, er det ikke korrekt?
#^[\w\d\-_\.æøåÆØÅ]+@[\w\dæøåÆØÅ\.\-_]+\.[a-Z]{2,}$#

Men det løser dog desværre ikke fejlen... :(
Avatar billede Slettet bruger
12. april 2010 - 22:45 #19
Det "+" du tilføjede var korrekt ja.
Prøv og ændre [a-Z] til [a-zA-Z], det er den del som er "offset 42".
Men vil ikke love det er der fejlen ligger, dog det eneste jeg lige kan få øje på pt.
Avatar billede htx98i17 Professor
12. april 2010 - 23:02 #20
Jeg tror sq det var det!

#^[a-zA-Z\-_\.æøåÆØÅ]+@[a-zA-Z\-_\.æøåÆØÅ]+\.[a-zA-Z]{2,}$#

Denne lader til at virke i hvert fald.

\d\w\s lader ikke til at fungere umiddelbart.

Tusind tak for hjælen, jeg har virkelig lært noget her! Husk at ligge et svar.
Avatar billede Slettet bruger
12. april 2010 - 23:10 #21
Jamen var da godt det kom til at virke!
Du får et svar her.
Avatar billede jantzen88 Nybegynder
13. april 2010 - 18:53 #22
hvad med at teste filter_var('test@example.com', FILTER_VALIDATE_EMAIL);
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester