| Autor | Zpráva | ||
|---|---|---|---|
| sloncz Profil |
#1 · Zasláno: 15. 3. 2015, 21:34:25
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 |
#3 · Zasláno: 15. 3. 2015, 22:10:57
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 |
#4 · Zasláno: 16. 3. 2015, 17:12:55
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. |
||
|
Časová prodleva: 11 let
|
|||
0