Regulární výraz pro kontrolu e-mailu

Při tvorbě jednoho webu jsem narazil na potřebu kontrolovat správnost zadané e-mailové adresy a hledal jsem různě na netu regulární výrazy, které by byly nejsprávnější pro tuto kontrolu. Našel jsem jich hodně, ale asi nejpoužitelnějším výrazem je následující výraz:

$regex = '^'.                            // bude se hledat na zacatku retezce
'[-a-z0-9!#$%&'*+/=?^_<{|}~]+'.         // jeden nebo vice povolenych znaku
'(.[-a-z0-9!#$%&'*+/=?^_<{|}~]+)*'. // muze nasledovat sekvence znaku obsahujicich povoleny znak nebo tecku
'@'.                                     // jen jeden zavinac
'[a-z0-9-]+'.                            // musi nasledovat jeden nebo vice alfanumerickych znaku nebo pomlcek
'(.[a-z0-9-]{2,})+'.                    // musi nasledovat jedna nebo vice casti obsahujicich tecku alfanumericke znaky a/nebo pomlcky
'$';                                     // pricemz tyto musi mit dva nebo vice znaku a takovou sekvenci musi kontrolovany retezec koncit

To se pak použije ve funkci eregi, která nekontroluje velikost znaků.

Update:

Po upozornění panem Vránou jsem kód opravil a teď už by měl být podle mě správně.

$regex = '^'.                            // bude se hledat na zacatku retezce
'[-a-z0-9!#$%&'*+/=?^_<{|}~]+'.         // jeden nebo vice povolenych znaku
'(.[-a-z0-9!#$%&'*+/=?^_<{|}~]+)*'.    // muze nasledovat sekvence znaku obsahujicich povoleny znak nebo tecku
'@'.                                     // jen jeden zavinac
'[a-z0-9-]+'.                            // musi nasledovat jeden nebo vice alfanumerickych znaku nebo pomlcek
'(.[a-z0-9-]+)*'.                        // mohou nasledovat casti obsahujici tecku alfanumericke znaky a/nebo pomlcky
'.[a-z0-9-]{2,}'.                       // musi nasledovat jedna cast obsahujici tecku alfanumericke znaky a/nebo pomlcky
'$';                                     // pricemz musi mit dva nebo vice znaku a touto sekvenci musi kontrolovany retezec koncit

Update 2:

Výše uvedené kódy obsahují chyby a proto jsem se rozhodl napsat správný kód do nového příspěvku — Viz Regulární výraz pro kontrolu e-mailu - update.

Komentáře

Nefunkční 

A proč by třeba a@a.a.cz neměla být validní e-mailová adresa? Ne nadarmo je na stránce přidávání poznámek do PHP manuálu toto varování:

(And if you're posting an example of validating email addresses, please don't bother. Your example is almost certainly wrong for some small subset of cases. See this information from O'Reilly Mastering Regular Expressions book ( http://examples.oreilly.com/regex/readme.html ) for the gory details.)

Napsal(a): Jakub Vrána (http://php.vrana.cz/), 28.04.2005, 09:22:48

Re: Nefunkční 

Skutečně mám v řetězci chybu. Pokusím se ho opravit při nejbližší příležitosti (asi až příští týden). Vycházel jsem z jiného příkladu, který byl na zmíněné stránce uveden a jen jsem jej opravoval pro speciální znaky. Takže jsem si již dříve zavedené chyby nevšiml. Díky za upozornění.

Napsal(a): Bohumír Bednařík (BoboCop) (http://www.bobocop.cz/webdesign.php), 28.04.2005, 09:44:47

Ještě chybka 

Nechci šťourat, ale ještě to není ono. Podle RFC 2822 ( http://www.faqs.org/rfcs/rfc2822 ) může být v adrese znak ` a naopak tam nesmí být znak <.

'[a-z0-9-]+(.[a-z0-9-]+)*.' by také bylo jednodušší zapsat jako '([a-z0-9-]+.)+'.

Napsal(a): Jakub Vrána (http://php.vrana.cz/), 28.04.2005, 14:03:21

Re: Ještě chybka 

No vidím, že to budu muset celé pořádně prověřit a napsat znovu. Evidentně jsem se tomu nevěnoval dostatečně důrazně.
To bude tím, že neovládám angličtinu a vlastně ani regulární výrazy (tohle byl jeden z mých prvních složitějších a vlastně ani není můj - je to upravený kód někoho jiného). Každopádně díky za upozornění.

Napsal(a): Bohumír Bednařík (BoboCop) (http://www.bobocop.cz/webdesign.php), 28.04.2005, 16:01:58

Přidání komentáře...










Poznámky k vyplnění formuláře

Nepoužívejte žádné HTML značky.
URL začínající http:// nebo ftp:// budou převedeny na odkaz.
Aby byl odkaz funkční, musí být z obou stran URL mezera.

   


Přeskočit na obsah