Autor Zpráva
sloncz
Profil
Hezký večer, chtěl bych se zeptat, zda php obsahuje funkci, která by mi v řetězci například nalezla slova, co obsahují znak "@" a vypsala mi ho? Chtěl bych z daného řetězce, najít a vypsat všechny emaily, co se v řetězci nachází
Juraj Hajdúch
Profil
Na to se hodí funkce preg_match respektíve preg-match-all. Podívej se na uvedené linky.

<?php
// z netu
$string = "any text name1@example.com any text name2@example.com any text";
$matches = array();
$pattern = '\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b';
preg_match_all($pattern, $string, $matches);
print_r($matches); 
?>
Joker
Profil
Juraj Hajdúch:
Zrovna tenhle kód je nefunkční.

Jednak to generuje warning, protože kolem regulárního výrazu nejsou oddělovače, jednak ten výraz neobsahuje malá písmena, takže v ukázkovém textu to nic nenajde.

Krom toho ani po opravení uvedeného to neodchytí delší domény než čtyřznakové, např. mail@example.website.

Spokojil bych se s jednodušším výrazem: $pattern = '#\S+@\S+#';
Ten sice formát adresy nekontroluje skoro vůbec (projde cokoliv v čem je zavináč někde uvnitř, třeba i a@a@a@a nebo *@*), nicméně validovat skutečně přesně formát e-mailové adresy regulárním výrazem je překvapivě složité a navíc obvykle zbytečné, protože správný formát ještě neznamená, že ta adresa existuje.
Juraj Hajdúch
Profil
Myslím, že pre bežné použitie stačí regexp:

/[a-zA-Z0-9\-\.]{1,}@[a-zA-Z0-9\-\.]{1,}\.[a-zA-Z]{2,}/.

Vyššie uvedený výraz však zďaleka nepokrýva všetky možnosti (viz napr. len wiki alebo ICANN). V súčasnosti môžu adresy obsahovať aj znaky národných abecied (napr. TLD .рф a pod.).

Ovšem, kto má chuť testovať výkonnosť hardwaru :o), tak môže použiť aj ten monstrózny regexp, na ktorý odkázal Joker: RFC822.

Pekný článok o kontrole emailovej adresy napísal J. Vrána, stojí zato prečítať si ho: kontrola e-amilové adresy.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0