Avatar billede zapzie Nybegynder
03. september 2007 - 12:14 Der er 26 kommentarer

Problemer med check af email

Jeg har lavet en side, hvor man kan oprette en bruger.
En af informationerne man skal indtaste er sin emailadresse.

Først checker jeg med javascript, om emailadressen er korrekt, er den det, kaldes en side der opretter brugeren. Her laves det samme check, bare i PHP.

Problemet er, at selv om checkene er ens, fejler nogle emails i php-koden og ikke i javascript. Er der nogen der har en forklaring og/eller løsning på dette?

De to checks er:
java script:
unction check_email(email) {
  var input = trim(email);
  var reg1 = /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)|(\s)/;
  var reg2 = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/;
  if (!reg1.test(input) && reg2.test(input)) {
    return true;
  }
  else {
    return false;
  }
}

PHP:
function check_email($email) {
  $input = trim($email);                                                                                                         
  $reg1 = "(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)|(\s)";
  $reg2 = "^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$";
  if(!eregi($reg1, $input) && eregi($reg2, $input)) {
    return true;
  }
  else {
    return false;
  }
}

Eksempel på email der fejler: bent.bussemand@gmail.com

Jeg tror det har noget at gøre med, når der er et punktum med og når ordet efter punktumet er for langt, eller muligvis hvis det er længere end det ord foran punktummet.
Jeg dog er ikke sikker på det er sådan det hænger sammen.

Pft.
Avatar billede erikjacobsen Ekspert
03. september 2007 - 12:35 #1
Du bør bruge preg-funktionerne i PHP.

Men hvad er baggrunden for at du gør dig så store anstrengelser med at checke den emailadresse, når du opnår at udelukke lovlige emailadresser?
Avatar billede zapzie Nybegynder
03. september 2007 - 13:22 #2
Ok, jeg vil kigge på preg, når jeg kommer hjem.

Nu er det ikke meningen at den skal udelukke gyldige email-adresser, vil bare sikre mig at de ikke indtaster noget der ikke er en email.
Det kan jo være man kommer til skrive lars@gmail..com, og her skal den så fange fejlen og skrive at det ikke er en gyldig email-adresse, så han kan skrive den om.
Avatar billede erikjacobsen Ekspert
03. september 2007 - 13:59 #3
Jo, men hvis du vil det, må du vel først og fremmest sikre dig, at du ved med sikkerhed hvad formatet er på lovlige emailadresser - hvis altså det skal bruges til noget fornuftigt ;)
Avatar billede zapzie Nybegynder
03. september 2007 - 14:02 #4
Og det er her i kommer ind i billedet :o)

Efter de test jeg har lavet, så virker det fint i javascript, men har problemer i PHP.
Håbede så der var en der kunne hjælpe med at få det til at virke begge steder.

Men jeg vil prøve med preg engang når jeg kommer hjem, det kan jo være det hjælper.
Avatar billede erikjacobsen Ekspert
03. september 2007 - 14:16 #5
Men inden "vi" kan hjælpe, ville det da være lidt relevant hvad det er vi hjælper til ;)
Om vi så kan få de to tests til at svare ens på de samme emailadresser, så vil der være lovlige emailadresser, der afvises, og det må du altså meget undskylde, men lige præcis det kunne jeg godt tænke mig at få klarlagt hvad du mener om.

Og, nej jeg kan ikke ryste op med en præcis beskrivelse af lovlige emailadresser.
Avatar billede zapzie Nybegynder
03. september 2007 - 14:23 #6
Ok.

Jeg undrer mig over hvorfor det samme check, ikke returnerer true på de samme ting, bare fordi det ene er i javascript og det andet er i PHP.
Efter hvad jeg kan se, virker checket korrekt i Javascript, og derfor vil jeg gerne have hjælp til at få det til at virke i PHP-koden.

Når jeg kommer hjem, kan jeg lave en lille test side, hvor der først checkes i javascript og hvis det accepteres her, checkes i php.

Jeg vil gerne vide:
- Hvorfor virker det ikke ens?
- Hvordan jeg får det til at virke i PHP, eller evt. have noget kode andre bruger til at checke email med?
Avatar billede zapzie Nybegynder
03. september 2007 - 14:24 #7
Eller helt kort:
Checket virker i javascript, men ikke i php.

Nogen der ved hvad der er galt?
Avatar billede erikjacobsen Ekspert
03. september 2007 - 17:06 #8
Kig på første indlæg: "Du bør bruge preg-funktionerne i PHP." - javascript regulære udtryk er tæt på de samme som for preg-funktionerne.

Men stadig: er det ligegyldigt at du afviser lovlige mail-adresser?
Avatar billede zapzie Nybegynder
03. september 2007 - 18:29 #9
Jamen så kig på andet indlæg: "Ok, jeg vil kigge på preg, når jeg kommer hjem.".
Nu er jeg hjemme...

Nej det er ikke ligegyldigt, det er jo netop derfor jeg vil have rettet fejlen i php.
Jeg har ikke oplevet at scriptet afviser gyldige mail-adresser.
Avatar billede olebole Juniormester
03. september 2007 - 18:35 #10
<ole>

Nej, men du har sikkert mange oplevelser til gode her i livet ... ole@bole.info

/mvh
</bole>
Avatar billede zapzie Nybegynder
03. september 2007 - 18:36 #11
Har prøvet at ændre eregi() til preg_match(). Får stadig samme fejl.
Avatar billede olebole Juniormester
03. september 2007 - 18:41 #12
Mon ikke, du skulle prøve at gøre, som Erik skrev: Kik på preg-funktionerne
    http://dk2.php.net/manual/da/ref.pcre.php
Avatar billede erikjacobsen Ekspert
03. september 2007 - 18:51 #13
Og hvordan ser din kode nu ud? Hvilke adresser opfører sig forskelligt?

Hvis du kun gætter dig til hvordan email-adresser ser ud, vil du jo nødvendigvis ramme skævt.
Avatar billede zapzie Nybegynder
03. september 2007 - 20:13 #14
Fandt javascriptet på en eller anden side, men kan selvfølgelig ikke finde den igen.

Tja, nu har scriptet jo ikke ændret sig det store, da jeg først lige er kommet tilbage til computeren igen.

Jeg har dette kode:
var reg1 = /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)|(\s)/;
var reg2 = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/;
if (!reg1.test(input) && reg2.test(input))

Det virker fint i javascript.
Det er ikke noget jeg selv har lavet, jeg har fundet det på en anden side, der forklarede lidt om email-check.

Jeg var så i den tro, at man bare kunne kopiere det til PHP, da de har nogle lignende metode.
Det har jeg så fundet ud af, at det kan man ikke. Hvert fald ikke med samme resultat.

Da jeg er langt fra en haj, til de regular expressions, ja faktisk en dum gås, har jeg næsten på fornemmelsen, så var det jeg søgte en der kunne forklare mig hvorfor det ikke er det samme i PHP og Javascript og måske en løsning, der fik det til at virke på samme måde i PHP.

Nu kan jeg snart ikke skrive det på flere måde, hvis jeg ikke skal til at gå over i tysk eller et andet sprog...

Hvis jeg bruger denne emailadresse: bent.bussemand@gmail.com så virker det fint i javascript, men i php returnerer den false, så emailadressen bliver afvist.
En email der virker i begge, kunne fx være: bent@gmail.com.

Umiddelbart vil jeg da mene både bent.bussemand@gmail.com og bent@gmail.com er gyldige emailadresser.
Avatar billede erikjacobsen Ekspert
03. september 2007 - 20:50 #15
Men når problemet er at det ikke virker med ereg-funktionerne, og vi så påstår at du bare skal bruge preg-funktionerne, så ville det da være lidt formålstjenligt om du prøvede.

Den side du fandt har en ikke en dyt forstand på emailadressers format. Jo, måske et enkelt forkølet "dyt" ;)
Avatar billede zapzie Nybegynder
03. september 2007 - 21:10 #16
Kommentar: zapzie
03/09-2007 18:36:18    Har prøvet at ændre eregi() til preg_match(). Får stadig samme fejl.

Men gider ikke spilde mere tid på det...

Jeg synes nu det virker meget godt, det check de har lavet, så det beholder jeg.
Jeg dropper så checket i php-koden, da det er nok de ser det på frontenden, da det er for at hjælpe brugeren.

Hvis du smider et svar, så får du points for at bruge tid på det, selvom jeg ikke fandt svarende særligt brugbare.
Avatar billede erikjacobsen Ekspert
03. september 2007 - 21:23 #17
Nu er det jo dit problem og ikke mit, så jeg kan være og er ligeglad.

Men du blev henvist det rigtige sted - det var bestemt noget brugbart. Du har på intet tidspunkt vist hvilken kode i PHP med preg_match, der ikke virkede. Det bevirker så at du ikke får mere hjælp. Smid koden herind, og så kan nogen hurtigt påpege hvad der er galt. Hjælp til selvhjælp.

Jeg tror ikke der skal mere til end det her:

  $reg1 = "/(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)|(\s)/";
  $reg2 = "/^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/";
  if(!preg_match($reg1, $input) && preg_match($reg2, $input)) {

men du kan jo prøve.

Og så samler jeg slet ikke på point, tak.
Avatar billede zapzie Nybegynder
03. september 2007 - 21:37 #18
Har lige hurtigt prøvet det du har skrevet, hvilket ser ud til at virke.
Mange tak skal du have.

Fatter så ikke, hvorfor du først kommer med det forslag, når jeg har givet op. Da det jo var noget i den stil jeg har søgt hele tiden.
Nu gider jeg ikke læse det hele igennem, men det kan være vi bare misforstået hinanden.

Nu er du så kommet med svar der virker.
Så hvis du vil have points så smid et svar og hvis du ikke vil have dem, så lad vær.
Opdaterer det i morgen.
Avatar billede erikjacobsen Ekspert
03. september 2007 - 21:44 #19
Jeg samler slet ikke på point, tak.

Jamen jeg fatter så til gengæld heller ikke at du ikke prøver og viser hvad du laver. Det er dit problem, du er ledt på rette vej i første linie, så spørg videre. Der er ingen grund til at jeg skal starte med at lave/gætte på den forkromede løsning med det samme.

Og jeg fatter heller ikke at du vil have en email-checker, der afviser lovlige emails.
Avatar billede olebole Juniormester
03. september 2007 - 23:21 #20
Du har endda fået et direkte link til preg-funktionerne i (03/09-2007 18:41:40), så du kunne se, hvordan syntaksen var  :)
Avatar billede jensgram Nybegynder
03. september 2007 - 23:30 #21
Som en lille sidebemærkning kunne http://www.regular-expressions.info/email.html være interessant læsestof.
Avatar billede zapzie Nybegynder
04. september 2007 - 08:09 #22
Ja, se nu giver det jo mening, at han spurgte om det var ok at afvise ugyldige emails.
Fx vil det jeg har jo afvise alle med .info-domæne.

Det må jeg lige have kigget på..
Avatar billede zapzie Nybegynder
04. september 2007 - 08:22 #23
Jeg har nu kigget på http://www.regular-expressions.info/email.html.
Jeg kan godt leve med de trade-offs har har med \b[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,4}\b

Jeg kan dog ikke få det til at virke.
Har prøvet med:
var reg = /\b[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,4}\b/
var reg = /^[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,4}$/

En der kan fortælle hvordan det skal laves, og gerne hvorfor?
Avatar billede erikjacobsen Ekspert
04. september 2007 - 08:51 #24
Det kommer an på hvad du vil opnå.

Fyren bag http://www.regular-expressions.info/email.html ved mere om email-adresser end det første sted du har kigget. Men hans eksempler er jo stadig problematiske. I hans allersidste eksempel glemmer han at sige, at man skal huske at udvide listen, når der kommer nye TLD-er. Der mangler i hvert fald to (og så er der nogen, der står to gange).

Så det vigtigste er egentlig at vide hvad din politik er omkring emailadresser. Uanset hvilket smart regulært udtryk du rammer, vil du jo kun få testet om formatet (syntaksen) er i orden, men ikke om email-adressen findes og fungerer. Og der vil altid være en risiko for at afvise lovlige, uanset hvilken brøkdel af en promille, der nu er tale om. Det er der i hvert fald i dine fra 08:22:34

Jeg skal ikke bestemme hvad du vil, men vil blot nævne en lidt mere anarkistisk tilgang.

1) Check at den allermest fundamentale syntaks er i orden - det kan være: "der er et punktum til højre for et @". Så bliver det da fanget hvis han skriver navn eller adresse i feltet.
2) Send en mail til adressen med et link, der skal klikkes på. Først når det klik er kommet accepteres adressen som værende en email.

Men der er fordele og ulemper ved alt.
Avatar billede zapzie Nybegynder
04. september 2007 - 09:00 #25
Tja. Det er ved at gå op for mig, at det er problematisk alt det med at checke emailen.

Det er sådan set ment til at fange dem der kommer til at skrive forkert, fx laver 2 .'er i stedet for et, samt fange dem der fx bare skriver "asdfgh".

Det kan da godt være det er bedre at sende en bekræftelsesmail ud, har bare haft problemer med at de emails jeg sender ud ryger i spamfiltret.

Det må jeg lige overveje, vender tilbage senere.
Avatar billede erikjacobsen Ekspert
04. september 2007 - 09:22 #26
"ryger i spamfiltret" - men det vil de jo så også gøre næste gang du skal sende ham en mail ;)
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