Co je validní e-mailová adresa?

Po napsání článku Regulární výraz pro kontrolu e-mailu by bylo asi dobré, abych trošku rozpitval ten kód, který byl v článku uveden.

Co je e-mailová adresa

Takže kód vychází z definice e-mailové adresy, tak jak je popsána v dokumentu RFC 822 (RFC 2822). Neovládám moc angličtinu (vlastně skoro vůbec), ale sem tam něčemu rozumím a podle zmíněného dokumentu se dá zjednodušeně říct, že e-mailová adresa se skládá ze tří částí:

  • část před zavináčem
  • zavináč
  • část za zavináčem

Část před zavináčem

Tato část se může obsahovat jedno nebo více tzv. slov navzájem oddělených tečkou. Tečka se nesmí vyskytovat těsně před znakem zavináč a nesmí se opakovat vícekrát za sebou.

Kód pro kontrolu části před zavináčem je následující:

$regex = '^[-a-z0-9!#$%&'*+/=?^_<{|}~]+' .
'(.[-a-z0-9!#$%&'*+/=?^_<{|}~]+)*'

Slovem je myšlena souvislá sekvence povolených znaků (v případě části za zavináčem povolených znaků mimo speciální znaky).

Část za zavináčem

Tato část může obsahovat jedno nebo více slov navzájem oddělených tečkou. Tečka se nesmí vyskytovat těsně za znakem zavináč a nesmí se opakovat vícekrát za sebou. Nejsou povoleny speciální znaky (viz níže). Za poslední tečkou musí následovat slovo o délce minimálně dva znaky, které označuje adresu Top Level Domény (TLD).

Kód pro kontrolu části za zavináčem je následující:

'[a-z0-9-]+(.[a-z0-9-]{2,})+$';

Povolené znaky

Povolenými znaky jsou skoro všechny tisknutelné znaky, tedy písmena oabecedy A-Z, číslice 0-9 a pomlčka.

Speciální znaky

Speciální znaky jsou podskupinou povolených znaků a mohou být použity jen v části před zavináčem. Jedná se o následující znaky:

!#$%&'*+/=?^_<{|}~

Závěrem

Předpokládám, že řádek kódu s kontrolou zavináče není třeba popisovat. Řětězec je nutné kontrolovat pomocí funkce eregi, která nerozlišuje velikost písmen.

Nevýhodou řetězce je to, že nekontroluje existenci TLD, ale pouze délku posledního slova za poslední tečkou (což je sice chyba, ale zanedbatelná). Dalo by se to udělat tak, že by řetězec obsahoval seznam všech dostupných řetězců TLD, ale nevýhodou tohoto řešení by bylo to, že pokud by se seznam řetězců TLD změnil, musel by se změnit i kontrolní řetězec. Zjišťování změn v seznamu TLD je poměrně netriviální záležitostí a proto si myslím, že použité řešení je lepší (sice nepřesné, ale zato univerzální).

Komentáře

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