/ Forside / Teknologi / Udvikling / Java Scripts / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java Scripts
#NavnPoint
molokyle 5410
Klaudi 2799
smorch 2439
kim 1360
Harlekin 1134
bentjuul 984
gibson 800
severino 695
Random 675
10  konsulent.. 626
RegExp: validering af emailadresse
Fra : Jesper Stocholm


Dato : 03-12-02 11:46

Jeg har brug for at kunne hjælpe mine brugere ved at fortælle dem, at
en emailadresse (sandsynligvis) ikke er korrekt. Til det bruger jeg
følgende RegExp:

var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
if (!filter.test(strEmail)) {
   bValidInput = false;
   alert('Emailadressen er ikke korrekt !');
}

MEN ... det er ikke helt bullit-proof. Fx validerer den følgende
emailadresser:

j.@stocholm.dk
..j@stocholm.dk
-j@stocholm.dk
j-@stocholm.dk

samt

j@.stocholm.dk
j@-stocholm.dk
j@stocholm-.dk
j@stoc--holm.dk

(der er ganske givet flere)

Spørgsmålet er : er ovenstående adresser valide givet RFC etellerandet?

Hvis det ikke er tilfældet, hvordan tweaker jeg så mit RegExp, så
det kommer til at virke (en smule bedre) ?



--
Jesper Stocholm - http://stocholm.dk

FAQ for dk.edb.internet.webdesign.serverside.asp : http://asp-faq.dk

 
 
Torben Brandt (03-12-2002)
Kommentar
Fra : Torben Brandt


Dato : 03-12-02 16:52

Jesper Stocholm wrote in dk.edb.internet.webdesign.clientside:
> Jeg har brug for at kunne hjælpe mine brugere ved at fortælle dem, at
> en emailadresse (sandsynligvis) ikke er korrekt. Til det bruger jeg
> følgende RegExp:
>
> var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
> if (!filter.test(strEmail)) {
>    bValidInput = false;
>    alert('Emailadressen er ikke korrekt !');
> }
Det sidste '+' i filteret skal ikke være der, for det giver bare mulighed for at
TLD'et (top level domain) er vilkårlig langt.

> MEN ... det er ikke helt bullit-proof. Fx validerer den følgende
> emailadresser:
>
> j.@stocholm.dk
> ..j@stocholm.dk
> -j@stocholm.dk
> j-@stocholm.dk
>
> samt
>
> j@.stocholm.dk
> j@-stocholm.dk
> j@stocholm-.dk
> j@stoc--holm.dk
>
> Spørgsmålet er : er ovenstående adresser valide givet RFC etellerandet?
RFC 822 [1] skriver nederst om hvordan nogle adresser ser ud. Jeg er dog ikke helt
sikker på at disse ARPA-meddelelser, som RFC'en omhandler, bare er almindelige
emails.
Men selv om det ikke er helt det samme, så ligner de nok :)

> Hvis det ikke er tilfældet, hvordan tweaker jeg så mit RegExp, så
> det kommer til at virke (en smule bedre) ?
Jeg synes hurtigt, at den RFC som til at se rimelig uoverskuelig ud, men måske kan
du selv eller en anden finde ud af, hvordan de må/ikke må se ud, og så kan vi vel
nok rettet RegExp'en til.

[1] <URL:http://www.faqs.org/rfcs/rfc822.html>

mvh Torben

--
Vil du lære at kode HTML, XHTML, CSS, SSI eller ASP ???
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Jens Gyldenkærne Cla~ (03-12-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 03-12-02 17:08

Torben Brandt skrev:

>> /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})
>> +$/;

> Det sidste '+' i filteret skal ikke være der, for det giver
> bare mulighed for at TLD'et (top level domain) er vilkårlig
> langt.

Men hvis man fjerner +'et skal længdegrænsen sættes op.
Blandt de nye TLD'er finder man .museum
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Peter Brodersen (03-12-2002)
Kommentar
Fra : Peter Brodersen


Dato : 03-12-02 18:30

On Tue, 3 Dec 2002 10:45:53 +0000 (UTC), Jesper Stocholm
<jespers@stocholm.invalid> wrote:

>Jeg har brug for at kunne hjælpe mine brugere ved at fortælle dem, at
>en emailadresse (sandsynligvis) ikke er korrekt. Til det bruger jeg
>følgende RegExp:
>
>var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;

Da det blot skal være en hjælp, kan jeg ikke se nogen grund til at
gøre det så kompliceret, og skulle have alle facetter med (fx
specifikt have alle tld's med).

Men om ikke andet kan du forsøge med:

/^([a-zA-Z0-9_\.\-])+\@([a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+([a-zA-Z0-9]{2,6})$/;

Delen før @'et ville jeg normalt ikke blande mig så meget i. Det er
ikke vores hovedpine.

I ovenstående kræver jeg mindst to led i det fulde domænenavn (omend
"dk" i princippet også kunne modtage post). Hvert led skal være på
mindst ét tegn (tal eller bogstav), og må evt. have et vilkårligt
antal tegn derefter (tal, bogstav eller bindestreg), forudsat at det
så slutter af med tal eller bogstav.

>if (!filter.test(strEmail)) {
>    bValidInput = false;
>    alert('Emailadressen er ikke korrekt !');
>}

Gør verden en stor tjeneste, og lav din alert om til en confirm, så
brugeren selv kan tage stilling. Der er alt for mange "sikre" scripts
derude, der en eller anden dag går hen og bliver defekt på grund af
forskellige omstændigheder (i ovenstående tilfælde fx den dag, nogen
alligevel opretter fx "what_not" i deres zone, har brugernavnet
"brodersen,peter", eller blot vil begynde at modtage post på @dk).

Og ærligt talt er der ikke noget værre end at stå foran et outdate'd
script, der fx insisterer på at det-og-det telefonnummer (eller
postnumer eller...) ikke findes. I den virkelige verden ville jeg være
insisterende og give medarbejderen 2-3 chancer, men hvis dit script
bliver ved med at være insisterende og ikke til at tale til fornuft,
så må jeg jo gå derfra med den erfaring rigere.

>MEN ... det er ikke helt bullit-proof. Fx validerer den følgende
>emailadresser:

Det kan ikke blive helt bullet-proof. Derfor anbefalingen af confirm
fremfor en alert/return false-combo.

>j@.stocholm.dk

Denne vil ikke blive accepteret i mit eksempel.

>j@-stocholm.dk

Denne vil ikke blive accepteret i mit eksempel.

>j@stocholm-.dk

Denne vil ikke blive accepteret i mit eksempel.

>j@stoc--holm.dk

Denne vil blive accepteret i mit eksempel - og det må den også godt.
Som et eksempel kan det nævnes, at domænet
"0-------------------------------------------------------------0.dk"
findes - og i øvrigt også har en MX-record.

>(der er ganske givet flere)

Hvor ofte er det dog, du er udsat for de tilfælde i praksis?

>Spørgsmålet er : er ovenstående adresser valide givet RFC etellerandet?

Phew, først og fremmest bør du nok undgå de tilfælde, hvor folk
serverer en gigant-regex, blot fordi de har læst i en bog, at "sådan
skal en e-mail-adresse valideres". RFC2822 fortæller om hvordan, man
konstruerer en string, der indeholder navn, e-mail-adresse, evt.
kommentarer undervejs, og så meget andet.

Det er ikke det, vi er interesseret i at validere (og slet ikke at
kræve at brugerne skal indtaste deres navn og e-mail-adresse i ét og
samme format i første omgang).

--
- Peter Brodersen

Jesper Stocholm (04-12-2002)
Kommentar
Fra : Jesper Stocholm


Dato : 04-12-02 11:46

Peter Brodersen wrote :

> On Tue, 3 Dec 2002 10:45:53 +0000 (UTC), Jesper Stocholm
> <jespers@stocholm.invalid> wrote:
>
>>Jeg har brug for at kunne hjælpe mine brugere ved at fortælle dem, at
>>en emailadresse (sandsynligvis) ikke er korrekt. Til det bruger jeg
>>følgende RegExp:
>>
>>var filter =
>>/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
>
> Da det blot skal være en hjælp, kan jeg ikke se nogen grund til at
> gøre det så kompliceret, og skulle have alle facetter med (fx
> specifikt have alle tld's med).
>
> Men om ikke andet kan du forsøge med:
>
> /^([a-zA-Z0-9_\.\-])+\@([a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+([a-z
> A-Z0-9]{2,6})$/;

ok

> I ovenstående kræver jeg mindst to led i det fulde domænenavn (omend
> "dk" i princippet også kunne modtage post). Hvert led skal være på
> mindst ét tegn (tal eller bogstav), og må evt. have et vilkårligt
> antal tegn derefter (tal, bogstav eller bindestreg), forudsat at det
> så slutter af med tal eller bogstav.

det lyder rimeligt ... :)

>>if (!filter.test(strEmail)) {
>> alert('Emailadressen er ikke korrekt !');

> Gør verden en stor tjeneste, og lav din alert om til en confirm, så
> brugeren selv kan tage stilling. Der er alt for mange "sikre" scripts
> derude, der en eller anden dag går hen og bliver defekt på grund af
> forskellige omstændigheder (i ovenstående tilfælde fx den dag, nogen
> alligevel opretter fx "what_not" i deres zone, har brugernavnet
> "brodersen,peter", eller blot vil begynde at modtage post på @dk).

Der forestages udelukkende tests på brugerdata, hvor der testes på
_forekomsten_ af data - dvs om et navn overhovedet er angivet (.length==
0). I andre tilfælde - som fx mobilnummer - testes der med RegExp meget
løst, dvs om telefonnummeret består af 8 cifre. Der testes ikke på
formatet ifb fastnet-numre, da der kan forekomme extensions/lokalnumre.

> I den virkelige verden ville jeg være
> insisterende og give medarbejderen 2-3 chancer, men hvis dit script
> bliver ved med at være insisterende og ikke til at tale til fornuft,
> så må jeg jo gå derfra med den erfaring rigere.
>
>>MEN ... det er ikke helt bullit-proof. Fx validerer den følgende
>>emailadresser:
>
> Det kan ikke blive helt bullet-proof. Derfor anbefalingen af confirm
> fremfor en alert/return false-combo.

jeps ... og dine bemærkninger har jeg taget til mig. Jeg fandt i min
søgning efter disse scripts også en del meget komplicerede scripts, men
jeg vil gerne have det så simpelt som muligt - samtidig med, at det vil
fange eventuelle tastefejl fra brugernes side.

>>j@stoc--holm.dk
>
> Denne vil blive accepteret i mit eksempel - og det må den også godt.
> Som et eksempel kan det nævnes, at domænet
> "0-------------------------------------------------------------0.dk"
> findes - og i øvrigt også har en MX-record.
>
>>(der er ganske givet flere)
>
> Hvor ofte er det dog, du er udsat for de tilfælde i praksis?

Det har jeg ingen anelse om da sitet ikke er "blevet født" endnu. Det er
dog en del af kravspecifikationen, at der skal testes med javascript om
emailadresser "er rigtige" ... og selvom jeg har presset på for at få det
slettet, så er den desværre ,ikke røget ud.

> Det er ikke det, vi er interesseret i at validere (og slet ikke at
> kræve at brugerne skal indtaste deres navn og e-mail-adresse i ét og
> samme format i første omgang).



.... tak for dine kommentarer ...

--
Jesper Stocholm - http://stocholm.dk

FAQ for dk.edb.internet.webdesign.serverside.asp : http://asp-faq.dk

Lasse Reichstein Nie~ (04-12-2002)
Kommentar
Fra : Lasse Reichstein Nie~


Dato : 04-12-02 12:30

Jesper Stocholm <jespers@stocholm.invalid> writes:

> Peter Brodersen wrote :

> > Men om ikke andet kan du forsøge med:
> >
> > /^([a-zA-Z0-9_\.\-])+\@([a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+([a-z
> > A-Z0-9]{2,6})$/;
>
> ok

Det udelukker dog en email som
lrn+foo@bar.com
som jeg gerne bruger hvis jeg opgiver adressen på en webside.
Det er en negativ oplevelse af siden, hvis jeg ikke får lov til at
skrive en ellers fuldt funktionsdygtig adresse.

Følgende tegn er lovlige før snabel-a'et (ud over bogstaver og cifre):
!#$%&'*+-/=?^_`{|}~.
jvf. RFC 2822.

/L
--
Lasse Reichstein Nielsen - lrn@hotpop.com
'Faith without judgement merely degrades the spirit divine.'

Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408527
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste