Avatar billede m_bold Praktikant
22. september 2006 - 15:50 Der er 9 kommentarer og
1 løsning

preg_match regulært udtryk

Hejsa.

Jeg har fundet denne stump kode, som skal verficere om en given e-mail adresse er opbygget som en e-mail adresse bør være. Men den returnerer en fejl, hvis e-mailen indeholder en bindestreg: -. Og det burde den jo ikke gøre.

function verify_addr ($address) {
  $return = false;
  if (preg_match ('/^[\w.]+@([\w.]+)\.[a-z]{2,6}$/i', $address, $domain)) {
    $domain = explode ('.', $domain[0]);
    // Split the domain into sections wherein the last element is either 'co', 'org', or the likes, or the primary domain name
    foreach ($domain as $part) { // Iterate through the parts
        if (substr ($part, 0, 1) == '_' || substr ($part, strlen ($part) - 1, 1) == '_')
          $return = false; // The first or last character is _
        else
          $return = true; // The parts are fine. The address seems syntactically valid
    }
  }
  return $return;
}

Kan nogen hjælpe med at rette i kodestumpen, så den duer 100%?

Tillægsspørgsmål: Jeg vil gerne have en bedre forståelse for hvordan man opbygger regulære udtryk i php. Kan nogen henvise til et sted, hvor det bliver forklaret på en forståelig måde?
Avatar billede erikjacobsen Ekspert
22. september 2006 - 17:18 #1
Der er egentlig ingen regler for hvad der må stå før et @, så ville det ikke være bedre bare at have:

  /^[^@]+@([\w.]+)\.[a-z]{2,6}$/i

På den anden side af @-et tillader du fx. ikke subdomæner:  mig@her.der.dom

Så hvad mener du med 100% ?  Og uanset den er "valideret", er der jo ingen garanti for den eksisterer  og "tilhører" den berørte person - det kan du kun se ved at sende en mail, og få en respons tilbage.
Avatar billede nielle Nybegynder
23. september 2006 - 07:52 #2
Hvis du gerne vil tillade '-'-tegn, kan det gøres sådan her:

preg_match('/^[\w.-]+@([\w.-]+)\.[a-z]{2,6}$/i', $address, $domain))

Selv plejer jeg nu at bruge denne:

^[\w._%-]+@[\w.-]+\.[a-z]{2,4}$

- som er en tilpasnig her fra:

http://www.regular-expressions.info/email.html

- hvor der også findes en rimelig grundig gennemgang af tradeoffs mellem forskellige måder at validere en emailadresse.
Avatar billede erikjacobsen Ekspert
23. september 2006 - 08:37 #3
[a-z]{2,4}  ?  Du vil ikke have en emailadresse der slutter på .museum ?  Og ja, de er sjældnere at finde end en intelligent politiker, men de er der dog: http://icom.museum/ 

Og nielle, er du sikker på, der ikke kan stå andet før @ end du har anført?

Bare en generel advarsel om ikke at komme til at afvise brugbare email-adresser fordi man tror man ved hvad en emailadresse er.
Avatar billede m_bold Praktikant
23. september 2006 - 08:52 #4
erikjacobsen --> jeg har testet dit forslag, og der mangler vist en mulighed for at have en bindestreg i domænet. Med 100% mener jeg blot at adressen er opbygget som en alm. e-mail adresse, jeg er godt klar over at jeg ikke kan tjekke om den eksiterer i virkeligheden. Nogen speciel grung til at du har parenteser omkring domænet?

nielle --> Godt link du smed der, det giver god info.

Jeg har fundet frem til en kombination af jeres forslag:

^[^@]+@[\w.-]+\.[a-z]{2,6}$

Kan I ikke lige kigge på den, og se om der er nogle fejl?
Avatar billede nielle Nybegynder
23. september 2006 - 08:56 #5
Ændringen fra "{2,6}" til "{2,4}" er et af de tradeoffs der diskuteres i det link jeg har givet. Jeg er egentlig enig med ham, men hvis man *skal* have museum med, kan det jo også gøres sådan:

^[\w._%-]+@[\w.-]+\.(?:[a-z]{2,4}|museum)$

Jeg siger ikke at der ikke må stå noget andet før @-tegnet. Imidlertid er der som sagt tale om en tradeoff ... mellem at fange samtlige lovlige emailadresse-formater med en monster-regexp eller at fange 99% at dem man reelt vil møde med en meget simplere regexp.

Monsteret kan ses hvis man scroller helt ned i bunden på:

http://www.regular-expressions.info/email.html
Avatar billede nielle Nybegynder
23. september 2006 - 08:59 #6
Jag kan ikke umiddelbart se nogen fejl i 23/09-2006 08:52:44 :^)
Avatar billede erikjacobsen Ekspert
23. september 2006 - 09:19 #7
I nielles link er der også et afsnit "Regexes Don't Send Email". Det udtrykker min holdning ret godt, men gør ikke argumentet færdigt. Så min mening: glem alt om at ramme de der 99% af lovlige emails. Selv en syntaktisk lovlig email eksisterer ikke nødvendigvis. Sørg i stedet for at afvise hvad der åbenlyst ikke er en syntaktisk lovlig email, og send så en email for at se om den findes.

Den regel jeg godt kan lide er: Står der et punktum til højre for et snabel-a?
Avatar billede m_bold Praktikant
23. september 2006 - 11:08 #8
Ok, ^[^@]+@[\w.-]+\.[a-z]{2,6}$ ser ud til at virke rigtig fint. Vil I begge to ikke lige smide et svar, så deler I pointsene?

Tak for hjælpen.
Avatar billede erikjacobsen Ekspert
23. september 2006 - 11:21 #9
Ingen point til mig, tak.
Avatar billede nielle Nybegynder
23. september 2006 - 16:06 #10
Der er to grunde til at validere email adresser:

1) Fordi at man vil være sikker på ar brugeren indtaster en korrekt email adresse.
2) Fordi at man vil hjælpe brugeren hvis denne af en eller anden grund får tastet sin emailadresse forkert.

Ad 1) Dette kan *kun* lade sig gøre hvis man rent faktisk sender en email til den opgivne adresse med en bekræftigelses email. Hvis brugeren nægter at opgive sin email adresse, kan hun til enhver tid opgive en 100% syntaktisk korrekt email-adresse som der bare ikke er nogen i den anden ende på.

Ad 2) Det er her at den med de 99% procent rigtige kommer ind. Ja, det kan være at det er fuldstændigt lovligt at skrive hvad som helst foran @'et, men det er nu meget sjældent at det sker! Ja, det kan være at der er en bruger som har en email adresse på museum TLD'et, men det er nu meget sjældent at det sker! Derimod er det langt mere almindeligt at folk simpelthen glemmer at skrive deres TLD, og at validatoren lader dette slippe igennem fordi at domænet tilfældigvis er på 6 eller færre bogstaver (som i "museum").
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