[regex] Fout in reguliere expressie e-mail

Pagina: 1
Acties:
  • 241 views sinds 30-01-2008
  • Reageer

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 18:03
Goeiedag,

Ik ben laatst bezig geweest met het schrijven van reguliere expressies om e-mailadressen te controleren. Op internet zie je altijd van die mooie regexes die enorm lang zijn, maar vaak werken deze niet en bovendien ben ik van mening dat je niet in één regex goed een e-mailadres kunt valideren.

Dus heb ik drie reguliere expressies geschreven. Nou eindigen ze allemaal met hetzelfde stukje, om de TLD te controleren.

Dit is er één (van de 3):
code:
1
@(([a-z0-9]|-)*[a-z]([a-z0-9]|-)+.)*([a-z0-9]|-)*[a-z]([a-z0-9]|-)+.[a-z]{2,5}$


Het probleem is dat een adres als dennis@dennis ook wordt geaccepteerd, ondanks de (volgens mij correcte) punt achter het plusteken en daaropvolgend het stukje [a-z]{2,5}$. Verder werkt het helemaal perfect, maar hier glipt hij doorheen.

Weet iemand raad?

  • Sendy
  • Registratie: September 2001
  • Niet online
Een punt in een regexp betekent "alles". Van achter af gelezen doet jouw regexp (negeer alle stukjes met een "*")

[a-z]{2,5} => "nis"
[a-z0-9]|- => "n"
[a-z] => "e"
[a-z] => "d".

Het lijkt me dus logisch dat "@dennis" gematcht wordt.

Probeer de "." eens te vervangen door "\.", en schrijf eens op wat het doel van deze regexp precies is. Misschien wordt het dan eenvoudiger om een simpelere regexp te schrijven.

[ Voor 18% gewijzigd door Sendy op 19-12-2006 11:25 ]


  • Mafkees
  • Registratie: Oktober 2003
  • Niet online
PHP:
1
2
3
4
if ( !@checkdnsrr(array_pop(explode("@", $email)), "MX") || preg_match("/[^0-9a-zA-Z\-\._\@]+/i", $email) )
{
     // fout
}


Een hele 'brute en lompe manier' van controleren misschien maar wel erg effectief. De eerste stap is om het domein (dus alles achter het @ teken) te controleren op het MX record, anders kun je er nooit naar e-mailen. Dan nog controleren of er andere tekens dan alphanumerieke tekens, streepjes, underscores, punten of apenstaartjes inzitten want volgens mij zijn die tekens het enige wat in een domein en e-mail adres mag voorkomen :)

Verwijderd

Ja google. Hier zijn namelijk zoveel kant en klare scriptjes en expressies over te vinden. Het loont echt niet meer om het zelf te schrijven.

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

In de toenaam mogen ook de ~, de # en de & voorkomen :) De _ mag trouwens niet in de domeinnaam voorkomen. En dit kan allemaal prima in 1 regexp, alleen wordt die vrij lang :+ Check eens de RFC822 specs.

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 18:03
Sendy schreef op dinsdag 19 december 2006 @ 11:24:
Probeer de "." eens te vervangen door "\.", en schrijf eens op wat het doel van deze regexp precies is. Misschien wordt het dan eenvoudiger om een simpelere regexp te schrijven.
Aha, dat had ik over het hoofd gezien. Op een pagina die ik had bezocht stond hij niet als special character. Ik heb hem ge-escaped en dat lijkt goed te werken! Bedankt :).
Mafkees schreef op dinsdag 19 december 2006 @ 12:11:
Een hele 'brute en lompe manier' van controleren misschien maar wel erg effectief. De eerste stap is om het domein (dus alles achter het @ teken) te controleren op het MX record, anders kun je er nooit naar e-mailen. Dan nog controleren of er andere tekens dan alphanumerieke tekens, streepjes, underscores, punten of apenstaartjes inzitten want volgens mij zijn die tekens het enige wat in een domein en e-mail adres mag voorkomen :)
Ten eerste gebruik ik geen php, maar dat zou ik natuurlijk kunnen omzeilen want er zijn ook vast oplossingen in andere talen. Daarnaast klopt je aanname over de tekens niet, want er zijn veel meer tekens die zijn toegestaan in het adres vòòr de domeinnaam. En underscores mogen, zoals BalusC al opmerkt, niet in een domeinnaam voorkomen.
Verwijderd schreef op dinsdag 19 december 2006 @ 12:17:
Ja google. Hier zijn namelijk zoveel kant en klare scriptjes en expressies over te vinden. Het loont echt niet meer om het zelf te schrijven.
Probeer even goed te lezen wat er in de openingspost staat. En als jij op internet een enkele reguliere expressie kan vinden die:
• Lengte van de domeinnamen
• Alle tekens in het gehele adres
• Controle koppelteken uitsluitend tussen twee alfanumerieke karakters
• Controle minimaal één alfa karakter
allemaal controleert, dan mag je hem hier plaatsen. Als je denkt dat je het zelf kunt schrijven mag dat uiteraard ook, maar nogmaals, ik ben van mening dat dat niet kan.

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

[q]• Controle koppelteken uitsluitend tussen twee alfanumerieke karakters
• Controle minimaal één alfa karakterSja, emailadressen als ~@-b.nl zijn geldig :)

Zie ook o.a. http://mythic-beasts.com/~pdw/cgi-bin/emailvalidate
De "vereenvoudigde" Java-variant van de regexp kun je hier vinden.

[ Voor 39% gewijzigd door BalusC op 19-12-2006 13:48 ]


  • Crayne
  • Registratie: Januari 2002
  • Laatst online: 17-03 13:41

Crayne

Have face, will travel

Mogen underscores nou wel of niet in domeinnamen, want bovengenoemde validator vindt "__@_g.nl" een valide email adres. :)

Mijn Library Thing catalogus


  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Dan is die validator fout :P Domeinnamen moeten aan RFC1035 voldoen.
Ik heb een aardige samenvatting gevonden: http://www.camtp.uni-mb.s...Book/SMTP_NameFormat.html

  • OxiMoron
  • Registratie: November 2001
  • Laatst online: 08-07 14:27
Zoals ik het lees mag je voor de @ alles wat geen space of control character is. best raar, want volgens mij valt de @ daar dus ook onder..

dus dan zou @@iets.nl ook mogen? :P

Edit: toch niet, @ is een special, die ook niet mag:
specials = "(" / ")" / "<" / ">" / "@" ; Must be in quoted-
/ "," / ";" / ":" / "\" / <"> ; string, to use
/ "." / "[" / "]" ; within a word.

[ Voor 44% gewijzigd door OxiMoron op 19-12-2006 14:09 ]

Albert Einstein: A question that sometime drives me hazy: Am I or are the others crazy?


  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 18:03
BalusC schreef op dinsdag 19 december 2006 @ 13:41:
Sja, emailadressen als ~@-b.nl zijn geldig :)
Nee, want een - moet tussen twee alfanumerieke karakters staan.
Zie ook o.a. http://mythic-beasts.com/~pdw/cgi-bin/emailvalidate
De "vereenvoudigde" Java-variant van de regexp kun je hier vinden.
Hmmm, zo complex zijn mijn expressies (gelukkig) niet! :+.
Crayne schreef op dinsdag 19 december 2006 @ 13:56:
Mogen underscores nou wel of niet in domeinnamen, want bovengenoemde validator vindt "__@_g.nl" een valide email adres. :)
Zoals gezegd klopt die validator dan niet.
OxiMoron schreef op dinsdag 19 december 2006 @ 14:08:
Zoals ik het lees mag je voor de @ alles wat geen space of control character is. best raar, want volgens mij valt de @ daar dus ook onder..

dus dan zou @@iets.nl ook mogen? :P
Nee, de @ mag je niet gebruiken. Deze mogen voor de @ komen:
code:
1
(!|#|\$|%|&|'|\*|\+|-|/|=|\?|\^|_|`|\{|\||\}|~|[a-z0-9])

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Dennis schreef op dinsdag 19 december 2006 @ 14:12:
Nee, de @ mag je niet gebruiken. Deze mogen voor de @ komen:
code:
1
(!|#|\$|%|&|'|\*|\+|-|/|=|\?|\^|_|`|\{|\||\}|~|[a-z0-9])
Waar heb je dit vandaan? O.a. de arithmetische operatoren mogen afaik niet in een emailadres voorkomen.

Verwijderd

Dennis schreef op dinsdag 19 december 2006 @ 13:35:
Probeer even goed te lezen wat er in de openingspost staat. En als jij op internet een enkele reguliere expressie kan vinden die [...]
Okee :)

code:
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
)+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:
\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(
?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[
\t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\0
31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+
(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:
(?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n) ?[
\t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\ r\n)?[
\t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[
\t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n) ?[
\t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t]
)*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[
\t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*
)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
)+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*)
*:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+
|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r \n)?[
\t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?: \r\n)?[
\t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t
]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031
]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](
?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?
:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?
:\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?
:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)? [
\t]))*"(?:(?:\r\n)?[ \t])*)*:(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\]
\000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|
\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>
@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"
(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t]
)*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?
:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[
\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\".\[\] \000-
\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(
?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;
:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([
^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\" .\[\]
\000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\ [\]
\000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\]
\000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]
|\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\".\[\] \0
00-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,
;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?
:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*
(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".
\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[
^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]
]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)(?:,\s*(
?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(
?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[
\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t
])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?
:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|
\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?:
[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n) ?[
\t])*(?:@(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["
()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n) ?[
\t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>
@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[
\t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,
;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t]
)*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?
(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".
\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:
\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\[
"()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])
*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])
+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(
?:\r\n)?[ \t])*))*)?;\s*)

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 18:03
BalusC schreef op dinsdag 19 december 2006 @ 14:18:
Waar heb je dit vandaan? O.a. de arithmetische operatoren mogen afaik niet in een emailadres voorkomen.
Ik weet niet wat arithmetisch is maar zie ook deze pagina:
http://derrick.pallas.us/email-validator/

Die is gebaseerd op de specificaties die ik trouwens ook zelf heb doorgenomen. :).
Begrijp jij ook wát hij doet? Wiskundig gezien kan hij trouwens niet kloppen als hij werkt zoals ik denk dat hij werkt (elk individueel karakter). Je kunt dan namelijk nooit controleren of een streepje wel tussen twee alfanumerieke karakters in staat.

Mocht hij anders werken dan ben ik benieuwd...

Verwijderd

e-mail adressen controleren...
Dennis schreef op dinsdag 19 december 2006 @ 15:33:
Mocht hij anders werken dan ben ik benieuwd...
Waar het om gaat is niet of deze wel of niet werkt, want daar kan je immers wat tests op los laten, maar dat dergelijke validators in overvloede aanwezig zijn op het www. Dus als je het wiel niet opnieuw hoeft uit te vinden dan is er genoeg te vinden.

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 18:03
Verwijderd schreef op dinsdag 19 december 2006 @ 15:42:
Waar het om gaat is niet of deze wel of niet werkt, want daar kan je immers wat tests op los laten, maar dat dergelijke validators in overvloede aanwezig zijn op het www. Dus als je het wiel niet opnieuw hoeft uit te vinden dan is er genoeg te vinden.
Ik begrijp je punt ;). Hopelijk kun je mijn mening onderschrijven dat veel van de op internet aanwezige reguliere expressie validators totaal niet compleet zijn. Ze zijn erg gemakkelijk om de tuin te leiden. In .NET zit ook een standaard e-mail regex, maar ook die is niet compleet. Zo heb ik er nog een paar getest van de op internet aanwezige uitvoeringen, maar ik vond de kwaliteit matig.

Als je dan besluit om zelf een controle te maken, moet je eigenlijk wel technisch weten wat er gebeurt. Een programmeur schrijft ook geen code die hij niet begrijpt. Dat is mijn punt :).

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Ik had me een tijdje terug ook beziggehouden met het zoeken naar de "ultieme" regexp emailadres validator. De RFC specs zijn imo ietwat te doorzichtig. Ik kan nergens in 1 officiële én duidelijke lijst/tabel terugvinden welke tekens überhaupt zijn toegestaan in de toenaam van de emailadres. Voor domeinnamen staat wel vast dat alleen de - is toegestaan, ongeacht de locatie/hoeveelheid in de domeinnaam.

Ik heb overigens nog een zooi vrije emailadres aliassen bij Xs4all staan. Ik had dus even een aantal tekencombinaties uitgeprobeerd. Xs4all gaat alleen akkoord met -, _ en & in de toenaam en dan nog moet de toenaam ten allen tijde beginnen met een alfanummerieke karakter. Het mag wel eindigen met de genoemde tekens. Alle andere op de toetsenbord beschikbare tekens zijn niet toegestaan. Zelfs niet de ~ en de #. Wel, Xs4all is geen harde richtlijn, het kan immers per ISP verschillen, maar het geeft wel een beeld :)

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Dennis schreef op dinsdag 19 december 2006 @ 14:12:
[...]
Nee, de @ mag je niet gebruiken. Deze mogen voor de @ komen:
code:
1
(!|#|\$|%|&|'|\*|\+|-|/|=|\?|\^|_|`|\{|\||\}|~|[a-z0-9])
Waarom gebruik je hier in vredesnaam een OR-ed subclass ipv een enkele characterclass?

Intentionally left blank


  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Ah, die wou ik dus net opzoeken...

Maar als dit is wat ik denk dat het is, dan voldoet zelfs deze regexp nog niet aan de RFC, want nested comments werken hierin niet :)

[ Voor 90% gewijzigd door een moderator op 20-12-2006 23:41 . Reden: Twee keer dezelfde code in één topic lijkt me vrij zinloos. ]

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Dennis schreef op dinsdag 19 december 2006 @ 11:07:
Het probleem is dat een adres als dennis@dennis ook wordt geaccepteerd, ...
offtopic:
dennis@dennis is dan ook een legaal mailadres. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Mafkees
  • Registratie: Oktober 2003
  • Niet online
Dennis schreef op dinsdag 19 december 2006 @ 13:35:Ten eerste gebruik ik geen php, maar dat zou ik natuurlijk kunnen omzeilen want er zijn ook vast oplossingen in andere talen. Daarnaast klopt je aanname over de tekens niet, want er zijn veel meer tekens die zijn toegestaan in het adres vòòr de domeinnaam. En underscores mogen, zoals BalusC al opmerkt, niet in een domeinnaam voorkomen.
De tekens die in de toenaam mogen had ik inderdaad niet goed. De underscore in de domeinnaam hoef ik niet af te vangen omdat ik een DNS check doe, ik denk dat dat een redelijk waterdichte manier is :)

  • blaataaps
  • Registratie: Juli 2001
  • Niet online
Mafkees schreef op woensdag 20 december 2006 @ 21:50:
De underscore in de domeinnaam hoef ik niet af te vangen omdat ik een DNS check doe, ik denk dat dat een redelijk waterdichte manier is :)
Ik weet wel zeker van niet, want een MX record is niet verplicht, naar een domein met alleen een A record kun je prima mailen (het wordt niet afgeraden, maar niet "verboden" door de rfc). En daar komt bij dat de aan- dan wel afwezigheid van een A of MX record op moment Y op jouw server X zegt natuurlijk helemaal niets over de geldigheid van een mailadres.

  • Mafkees
  • Registratie: Oktober 2003
  • Niet online
Hmz maar stel dat je dan ook op A record zou checken, hoewel ik denk dat 9 van de 10 domeinen waarmee gemailed en waarnaar gemailed wordt wel een geldig MX record heeft, mag je er dan niet vanuit gaan dat het domein geldig voor e-mail is?

Als je op een bepaald moment geen DNS check kan doen heb je idd een probleem, maar hoe vaak gebeurt dat.

edit: moet verhuizen, kom d'r op terug :P

  • Tanuki
  • Registratie: Januari 2005
  • Niet online
^[a-z0-9][a-z0-9_.\-]*@([a-z0-9]+\.)*[a-z0-9][a-z0-9\-]+\.([a-z]{2,6})$

PV: Growatt MOD5000TL3-XH + 5720wp, WPB: Atlantic Explorer v4 270LC, L/L: MHI SCM 125ZM-S + SRK 50ZS-W + 2x SRK 25ZS-W + SRK 20ZS-W Modbus kWh meter nodig?


  • blaataaps
  • Registratie: Juli 2001
  • Niet online
Mafkees schreef op donderdag 21 december 2006 @ 10:10:
Hmz maar stel dat je dan ook op A record zou checken, hoewel ik denk dat 9 van de 10 domeinen waarmee gemailed en waarnaar gemailed wordt wel een geldig MX record heeft,
Ik vind 10% false negatives best wel veel eigenlijk, zeker als je ze vantevoren al aan ziet komen :)
mag je er dan niet vanuit gaan dat het domein geldig voor e-mail is?
Misschien moet je behalve checken of het een A of MX record heeft ook even kijken of de genoemde IP's op poort 25 luisteren, en of ze mail accepteren voor dat domein, of beter nog, misschien moet je even kijken of die mailserver mail accepteert voor die specifieke recipient.
Er is een groot verschil tussen geldigheid en afleverbaarheid, en het varieert nogal per applicatie welke je wil verifieren. Voor veel inputvalidatie voldoet geldigheid natuurlijk, als men dan een mailadres invult wat niet bestaat is dat de eigen verantwoordelijkheid. Als je wil weten of een e-mail adres "werkt" is er een hele simpele check, daar is zelfs speciale software voor, namelijk een MTA :)
Als je de geldigheid wil bepalen, volstaat een simpele (of minder simpele) controle op de syntax bijvoorbeeld met een reguliere expressie, dus waarom zou je dan een halve mailserver gaan implementeren binnen je applicatie, dat is namelijk al vaak genoeg gedaan en waarschijnlijk beter ook nog.
Als je op een bepaald moment geen DNS check kan doen heb je idd een probleem, maar hoe vaak gebeurt dat.
Vaak genoeg, en dat ligt lang niet altijd binnen je eigen macht.

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

l0c4lh0st schreef op donderdag 21 december 2006 @ 10:19:
^[a-z0-9][a-z0-9_.\-]*@([a-z0-9]+\.)*[a-z0-9][a-z0-9\-]+\.([a-z]{2,6})$
Dus .. blaat.@blaat.nl is geldig? Je hebt die punt in de 2e blok trouwens ook niet geëscaped. Het domeinnaam gedeelte is ook een beetje onhandig opgezet.

[ Voor 10% gewijzigd door BalusC op 21-12-2006 11:04 ]


  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 18:03
BalusC schreef op dinsdag 19 december 2006 @ 21:19:
Voor domeinnamen staat wel vast dat alleen de - is toegestaan, ongeacht de locatie/hoeveelheid in de domeinnaam.
Nee, een - mag niet aan het begin dan wel het einde van een domeinnaam, maar moet altijd tussen twee alfanumerieke karakters in staan.
crisp schreef op woensdag 20 december 2006 @ 11:00:
Waarom gebruik je hier in vredesnaam een OR-ed subclass ipv een enkele characterclass?
Volgens mij had ik zoiets eerst, maar het werkte niet (ik had vast iets fout) en toen heb ik het hiernaar herschreven en toen werkte het wel :9.
-NMe- schreef op woensdag 20 december 2006 @ 15:35:
offtopic:
dennis@dennis is dan ook een legaal mailadres. ;)
Vertel :?.
Mafkees schreef op donderdag 21 december 2006 @ 10:10:
Als je op een bepaald moment geen DNS check kan doen heb je idd een probleem, maar hoe vaak gebeurt dat.
Nouja, misschien wil je wel e-mailadressen controleren in een client applicatie, en dan wil je de klant niet opzadelen dat hij verplicht verbonden moet zijn aan internet. En met javascript is het ook lastig :+.

  • blaataaps
  • Registratie: Juli 2001
  • Niet online
Wat valt er meer aan te vertellen dan "het is een geldig adres"? Dat jij daar misschien nog een iets met een . ofzo achter wil zien betekent niet dat het een ongeldig adres is, dat jouw mailserver er misschien geen raad mee weet betekent net zo min dat het ongeldig is.

[ Voor 33% gewijzigd door blaataaps op 21-12-2006 18:22 ]


Verwijderd

Omdat dennis een geldige hostname is. Of een e-mail adres ook KAN werken, zou je kunnen bepalen of er voor de hostname een MX record opgevraagd kan worden.

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Dennis schreef op donderdag 21 december 2006 @ 17:44:
Nee, een - mag niet aan het begin dan wel het einde van een domeinnaam, maar moet altijd tussen twee alfanumerieke karakters in staan.
Wandel eens bij de online domeinboeren langs. Speel een beetje met hun "Is Uw domein nog beschikbaar?" zoekformulieren en dan zul je zien dat de streepjes aan het begin en het eind van een domeinnaam toegestaan zijn :) De hoeveelheid streepjes direct achter elkaar is ook "onbeperkt".

edit:
Bij nader inzien: dat verschilt zelfs per domeinboer 8)7 Maargoed, het is iig mógelijk.

[ Voor 8% gewijzigd door BalusC op 21-12-2006 19:57 ]


Verwijderd

BalusC schreef op donderdag 21 december 2006 @ 19:53:
[...]
Wandel eens bij de online domeinboeren langs. Speel een beetje met hun "Is Uw domein nog beschikbaar?" zoekformulieren en dan zul je zien dat de streepjes aan het begin en het eind van een domeinnaam toegestaan zijn :) De hoeveelheid streepjes direct achter elkaar is ook "onbeperkt".
Neemt niet weg dat het aan de beheerder van de tld is om te bepalen welke domeinnamen binnen dat tld geregistreerd mogen worden. Het idee dat een - tussen twee alfanumerieke tekens moet, is waarschijnlijk afkomstig van het feit dat de SIDN alleen .nl domeinnamen registreert waarin geen liggend streepje aan begin of eind, of naast een ander liggend streepje staat.

Dit zegt inderdaad niets over de geldigheid van een hostname volgens de specificatie.

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 18:03
blaataaps schreef op donderdag 21 december 2006 @ 18:20:
Wat valt er meer aan te vertellen dan "het is een geldig adres"? Dat jij daar misschien nog een iets met een . ofzo achter wil zien betekent niet dat het een ongeldig adres is, dat jouw mailserver er misschien geen raad mee weet betekent net zo min dat het ongeldig is.
Nouja, Cheatah legt het onder jou even uit, dat was waar ik naar op zoek was :).
Verwijderd schreef op donderdag 21 december 2006 @ 19:58:
Neemt niet weg dat het aan de beheerder van de tld is om te bepalen welke domeinnamen binnen dat tld geregistreerd mogen worden. Het idee dat een - tussen twee alfanumerieke tekens moet, is waarschijnlijk afkomstig van het feit dat de SIDN alleen .nl domeinnamen registreert waarin geen liggend streepje aan begin of eind, of naast een ander liggend streepje staat.

Dit zegt inderdaad niets over de geldigheid van een hostname volgens de specificatie.
Ik had wel uit één of ander document vernomen dat dat dus nooit kan. Maarja, misschien klopt dat dan ook niet.
Pagina: 1