webForumDet fria alternativet

Regexp som kollar epostadresser

PHPur PHP

9 svar · 413 visningar · startad av aasah

Medlem sedan mars 20034 471 inlägg
Frågan#1

Försöker skriva en koll som gör att man kan vara rimligt säker på att en given epostadress är en epostadress och inte vad skräp som helst.

Jag har klurat och undrar om detta verkar vara ett vettigt mönster:

$eFormat = '/[^@]+@[^@\\.]+[\\.[^@\\.]]*\\.[^@]+/';

Gör det "rätt" så till vida att OK adresser går igenom? Eller finns det bättre mönster som fångar fler fel?

Medlem sedan mars 2003429 inlägg
#2

Du har säkert kollat detta script innan, men kan ju inte skada att tipsa om det. http://www.webforum.nu/showthread.php?s=&threadid=63579&forumid=151

Förstår dock inte hur du kom fram med det resultat du fått hittils, bara det är som ren latin för mig att försöka förstå. =(

Medlem sedan mars 20034 471 inlägg
#3

Duffer skrev:

Du har säkert kollat detta script innan, men kan ju inte skada att tipsa om det. http://www.webforum.nu/showthread.php?s=&threadid=63579&forumid=151

Nej det hade jag inte. Tyvärr begriper jag inte vilken del som plockar ut epostadressen... eller snarast fattar jag inte HUR den gör det? Ska se om det går upp en taljdank imorgon när jag är piggare.

Duffer skrev:

Förstår dock inte hur du kom fram med det resultat du fått hittils, bara det är som ren latin för mig att försöka förstå. =(

Tja, eftersom det inte funkar... så missar du inget!

Medlem sedan mars 20025 907 inlägg
#4
function checkemail($mail) {
	if (!isset($mail) or empty($mail)) 
		return false;
	$mail = trim($mail);
	if (eregi('^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$',$mail)){ 
		return true; 
	}else{
		return false; 
	}
}

Vet inte riktigt hur det är med åäö i mailadresser (om det är godkänt numera), isf får man väl ändra lite i mönstret. Som det är nu godkänns de inte av scriptet iaf.

Medlem sedan mars 20034 471 inlägg
#5

Ah! Tackar! :D Den funktionen går ju tom att läsa utan att se ut så här efter ett tag: @^@

Medlem sedan mars 20034 471 inlägg
#6

Är det någon som ser skillnaden mellan Peeers funktion ovan som använder eregi och min som använder preg_match?

function checkEmailOK($mail) {
   if (!isset($mail) or empty($mail))
      return false;
   $mail = trim(strtolower($mail));
   $pattern2 = '/^[_[a-z]\\d-]+(\\.[_[a-z]\\d-]+)*@[_[a-z]\\d-]+(\\.[_[a-z]\\d-]+)*\\.[a-z][a-z]$/';
   $pattern3 = '/^[_[a-z]\\d-]+(\\.[_[a-z]\\d-]+)*@[_[a-z]\\d-]+(\\.[_[a-z]\\d-]+)*\\.[a-z][a-z][a-z]$/';
   return (preg_match($pattern2, $mail) || preg_match($pattern3, $mail));
}

Jag tror nämligen inte att "min" server förstår annat än Perls regexp. Denna ihopknåpade historia godkänner inte diverse riktiga epostadresser... :( (Exempelvis påstår den att namn@telia.com inte är en giltig adress... )

Red: Tror att det blev dubbla esc-tecken bakom kulissen överallt nu...

Medlem sedan mars 20034 471 inlägg
#7

Jag tycker det verkar som att man inte kan ha esc-tecken i en grupp? Hur som helst, oavsett varför ovanstående inte funkar, nedanstående gör det:

function checkEmail($email) {
   $email = trim(strtolower($email));
   //Måste vara: #@#.#   (Om # motsvarar godtyckligt tecken (ett eller flera))
   $pattern = "/^(.)+@(.)+\\.(.)+$/";
   if (!preg_match($pattern, $email))
      return FALSE;
   else {
      // Innehåller EJ: .., .@, @. mer än ett @ eller börjar/slutar på .
      $not = "/(\\.\\.)|(@\\.)|(\\.@)|(@(.)*@)|(\\.$)|(^\\.)/";
      if (preg_match($not, $email))
         return FALSE;
      else {
         // Tillåtna tecken är a-z, 0-9, -, _, ., @
         $chars = "/^(([a-z])+|([0-9])+|(\\.)|(-)|(_)|(@))+$/";
         return preg_match($chars, $email);
      }
   }
}

Det finns säkert effektivare, bättre och mer fullständiga koller, men denna fungerar i alla fall tillräckligt bra för mitt ändamål. (Tror inte att trippelgenomletning tar märkbart längre tid eller för mycket resurser då den sannolikt ej körs alltför ofta...)

Medlem sedan feb. 20034 441 inlägg
#8

Hej!
Återuppväcker en gammal tråd nu.

Har precis klivit in lite i php och har problem med ett av ovanstående kodexempel:

function checkEmail($mail, $name) {
	if (!isset($mail) or empty($mail)) 
		return false;
	$mail = trim($mail);
	if (eregi('^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$',$mail)){ 
		return "<a href=\"mailto:\"" . $mail . "\">\"" . $name . "</a>"; 
	}else{
		return $name; 
	}
}

Nu har jag modifierat det lite, men det är eg. ingt fel på koden (mig vetligt).
Felet är att funktionen inte ger något tillbaks, inget skrivs ut. Kanske jag gör fel när jag ska kalla på funktionen?

Det jag vill uppnå är:
- Skickar in emailadress & namn från en MySQL-DB in i funktionen.
- Koden ska kolla om emailadressen är "giltig".
- Är den det, skriv ut en mail-länk med avsändarens namn som länktext.
- Är den inte giltig, skriv endast ut namnet.

Det här returnerar alltså inget alls, får heller inget felmeddelande.

Vad gör jag för fel?

Medlem sedan mars 20025 907 inlägg
#9

MickeA.com > Koden fungerar utmärkt för mig, men du måste skilja på returnera och skriva ut. Funktionen ovan returnerar en sträng som du sedan får skriva ut, den skriver alltså inte ut något självmant

echo checkEmail('user@doman.se','Boop'); kommer att skriva ut en mailto-länk.

Lite väl många citattecken i koden ovan dock.

//ersätt
return "<a href=\"mailto:\"" . $mail . "\">\"" . $name . "</a>"; 
//med
return "<a href=\"mailto: $mail \">$name</a>";
Medlem sedan feb. 20034 441 inlägg
#10

Jasså, somsagt, bara en glad amatör som just tagit klivit från Asp till Php.

Tack för hjälpen!

141 ms totalt · 3 externa anrop · v20260731065814-full.25f56b17
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)