me na masce vadi na prvni pohled to, ze adresy z domeny tretiho radu podle ni nejsou platne... nejsem si jisty, ale mozna ze v adrese muze byt jeste i jiny nez alfanumericky znak, treba _
pak by me zajimalo, jak to, ze regularnimu vyrazu 234 odpovida regularni vyraz 9912377 (zacatek clanku).
_ se nesmi pouzit nikdy, protoze to neni povoleny znak pro domenove jmeno, da se pouzit omezene jen uvnitr NT siti, protoze NT4 ho pouzit dovoluji, v active directory jiz pouzit nejde.
Externe pouzit nejde, zadna verze bindu ho bez specialni konfigurace nebo hacku nedovoli
V domene druheho radu muze byt i pomlcka, ktera neni alfanumerickym znakem, tedy misto prosteho [[:alnum:]] by se dalo pouzit treba [a-zA-Z\-]. V nazvu schranky (uzivatelskem jmene, proste tim pred zavinacem) pro zmenu muze byt podtrzitko a jak uz bylo receno i tecka (ne vsak vice tecek za sebou).. [a-zA-Z_\-]+(\.[a-zA-Z_\-]+)*
Pak urcite existuji omezeni kde ty pomlcky a podtrzitka mohou byt (myslim si, ze by domena nemela pomlckou zacinat, snad ani koncit, ale to uz nevim...), takze pro uplnou spravnost by to bylo zrejme jeste o neco malo slozitejsi, ale kdo by to uz takhle kontroloval?... :)
Jooo takze,
Omlouvam se za ty dve chybicky v cislech, uz jsou opraveny... Dale | znamena samozrejme disjunkci a ne konjunkci. Uznavam chybu a jeste jednou se omlouvam... SORRY :)
A ted k domacimu ukolu:
Nekteri z vas jsou uz docela hodne blizko, ne-li ve finishi protoze moznosti, jak docilit vysledku je samozrejme vic. Diky za praci co jste si s tim dali :)
Autor clanku
Clanek je k nicemu a o nicem - tem, kteri se v regexp vyrazech vyznaji jen poskytuje vitanou moznost zepsout autora za chyby, ti, kteri v nich zatim tapou a doufali, ze jim pomuze, musi byt nutne zklamani.
Nicmene regulani vyraz, ktery by overil sparvny format emailu by mohl vypadat zhruba takto (jednotlive casti se pokusim vysvetlit ponekud lepe nez autor clanku):
^([A-Za-z0-9-_\.]+)@([A-Za-z0-9\.]+)\.([a-z]{2,7})$
Znak ^ rika, ze jsme na zacatku retezce. Dale nasleduje specifikace moznych znaku, ktere se mohou vyskytnout v casti pred zavinacem - tedy alfanumericke znaky a podtrziko, pomlcka ci tecka (musi byt "odescapovana" zpetnym lomitkem, cimz ztrati svuj specialni vyznam zastupce libovolneho znaku). Znak "+" rika, ze tato cast nesmi byt prazdna, resp. musi obsahovat alespon jeden ze specifikovanych znaku (zde by bylo na miste rict, ze by asi nebylo dobre povolit adresu typu _@domena.tld atp., ale teoreticky to mozne je).
Nasleduje zavinac jakozto neoddiskutovatelne povinny znak. Cast za nim specifikuje domenu - tato cast se muze opet skladat pouze z alfanumerickych znaku nebo tecky (pokud se jedna o 3rd level domenu - napr. user@3rdlevel.2ndlevel.tld atp.). Pokud budeme mene striktni, muzeme i v teto casti povolit i podtrzitko a pomlcku.
Dale nutne musi nasledovat znak tecka a ve finale 2 - 7 znaku vyhradne v mezich malych alpha znaku (a-z)! (nezapomenme na nove tld domeny dosahujici teto delky! - tld domena culture).
Na zaver se omlouvam za ponekud delsi vylev, obvykle nemam ve zvyku clanky na rootu komentovat, ale tento mi prisel - bohuzel - tak spatny, ze jsem si to neodpustil ;)
Nepatrim mezi lidi, kteri nesnesou kritiku, ale kritiku, ktera je spatna alespon bez citovych vylevu opravim :)
Coolfighter napsal:
"tem, kteri se v regexp vyrazech vyznaji jen poskytuje vitanou moznost zepsout autora za chyby"
Tak se podivame na tvoje chyby a neni jich malo:
1) Co je v prvni casti retezce to 0-9-_ ? Mnozina znaku 0 az 9 az pomlcka? Ma to byt samozrejme 0-9\-_ :)
2) V casti za zavinacem si necitoval znak - (tedy \-).. Neprosel by tedy napriklad email coolfighter@e-mail.cz
3) Coolfighter napsal: "a ve finale 2 - 7 znaku vyhradne v mezich malych alpha znaku (a-z)!"
Tak v mezich vyhradne malych alpha znaku? Nejsem prvni kdo to rika takze budu citovat; Vega napsal:
"koncovka může být i velkejma písmenama :) Sice to píšou jenom prasata, ale chci tě vidět to písemně vysvětlovat na svym webu dementnim uzivatelum... Misto toho radši použij strtolower :)"
Dodavam jen, ze uz jsem se setkal s lidmi co mi poslali mail jako neco.CZ
Tak to jsem mel na srdci. V necem jsem sice napovedel ostatnim jak to ma byt nejlepe (to stejne neni na skodu), ale tvuj komentar je takovy, ze jsem si to neodpustil :)
Jen k tomu, ze BFU se v clanku nic nedozvi - priznavam otevrene, ze ja sama coby editor jsem autora navedla, aby to pojal tak, ze uplne zaklady nebude prilis podrobne prozivat (v puvodni verzi tam byl dost dlouhy uvod do nich) - vetsina lidi v nejake forme regularni vyrazy zna (z bezneho sebu, perlu, vimu apod.), jde o to, ze jsou jich ledasjake druhy a rozsireni a prislo mi fajn, aby clovek, co prijde k PHP a regularni vyrazy jiz odnekud jinud zna, se zde dozvedel, jak to tam s nimi je a jak je muze pouzivat.
Ja osobne z PHP neumim ani radku, ale regularnich vyrazu obecne znam kupu implementaci, proto, az se budu chtit naucit PHP, se zde rada dozvim to male delta informaci, abych tam mohla pouzit to, co uz znam.
snad jen toto:
pokud o nekom napisete, ze nic neumi, zamyslete se nejdriv nad sebou.
vas r.v.
^([A-Za-z0-9-_\.]+)@([A-Za-z0-9\.]+)\.([a-z]{2,7})$
po opravene chybce
^([A-Za-z0-9\-_\.]+)@([A-Za-z0-9\.]+)\.([a-z]{2,7})$
pusti treba i adresu
.@..cz
pokud si nejste jisty, exisuje jedna krasna stranka: http://www.regexp.cz/
doporuciji obcas pouzit, o mozku nemluve
p.g.
podle mne celkem dobrý článek. Ke kritice k chybám v textu, to je samozřejmě špatně. Jinak to je článek na úrovni. Ke kritice od fightera: Jak si popisoval ten svůj regulární výraz. Vlastně vysvětluješ metaznaky uplně stejně jako autor... tak nevim co ti vadí a ten tvuj výraz je stejně špatnej... koncovka může být i velkejma písmenama :) Sice to píšou jenom prasata, ale chci tě vidět to písemně vysvětlovat na svym webu dementnim uzivatelum... Misto toho radši použij strtolower :) Takže nekritizuj něco čemu nerozumíš :) A neoháněj se cizíma slovama, o kterých si myslíš, že je ostatní neznaj :)
Ovsem pokud chces se regularni vyrazy ucit z clanku... no nevim neni to kompletni a tak. Snad to nemela byt ucebnice. Odkazy na zdroje jsou taky tak je to docela ok, i když něco bych udělal obratněji... Dávám dvojku :)
Clanok som prebehol iba velmi rychlo, pretoze POSIX regularne vyrazy su oproti tym perlovskym (tiez podporovane standardne v PHP) velmi slabe. Tiez reg matching je u tych POSIX pomalsi a da sa ziskat iba max. 10 podvyrazov (pouzitim zatvoriek (...) ). Perlovske regexp maju take krasotinky ako asercie, podmienky, .. a ine krasne features, vseliake flagy vyhladavania (multiline, extened, case sensitivity a co ja viem este ake). a napr namiesto dlhych [[:digit:]], [[:alnum:]], [[:space:]] [[:<:]] a dalsich masakrov staci napisat \d \w \s \b. A funkcia preg_replace_callback je niekedy na nezaplatenie. Perl regularnym vyrazom saom napisal reverzny proxyserver. To bol vyraz na pol strany, mal vseliake podmienky, vetvenia, callbacky .. lahodka :) mnam.
Takze, kto xe robit s regularnymi vyrazmi nieco fakt vazne, fakt vrele odporucam perlovske a NIE POSIX regexpy! Nastudujte si ich a uvidite, ze regularne vyrazy vo vseobecnosti a hlavne perlovske vam zmenia zivot k lepsiemu :). Rucim za to :-P (PS: v dokumentacii k PHP je podla mna vyborny popis perlovskych regexp; PPS: JavaScript vyuziva tiez perlovske regexp!)
Hm hm hm, až jednou napíšete regexep, a on se bude matchovat a matchovat a matchovat ... a nikdy to neskončí, tak si možná pak přečtete něco o tom, že složitost matchování posixových regulárních výrazů nemůže -- na rozdíl od pcre -- růst exponenciálně. Takže *identický* výraz preg matchne rychleji (to je pravda a čistě implementační otázka, nechcete doufám tvdrit, že je ta rychlost inherentní vlastnost těch výrazů), ale jinak tupý (a delší) posixový regexp snadno může matchnout rychlejí než krátký a chytrý pcre řešící tentýž problém, protože složitost je skrytá. Takže s rychlostí bych byl opatrný...
Když už jste to nakousl, možná by nebylo na škodu upozornit BFU, že se má po kontrole regulárním výrazem podívat, jestli existuje MX record, případně A record (viz. getmxrr a podobné funkce).
Jinak co se týče článku, tak tentokrát mám pocit, že to bylo opravdu poněkud nedovařené a nejlepším zdrojem informací o tom, jak fungují POSIXové regulární výrazy, zůstane prozatím man page pro regex.
Chtěl bych autora článku upozornit, že pokud zadá úkol "nejasně" (alespoň dle debaty, jak formát emailu vlastně vypadá), pak jen obtížně najde "výsledek", na kterém se všichni shodnou ! Pak je zbytečně znevažována jeho práce a to je škoda !
Kdyby se postupovalo od jednoduššího ke složitějšímu, bylo by to didaktičtější -
např. nejprve vzor pro email: "prijmeni@root.cz", pak "jmeno.prijmeni@root.cz", přes "predzavinacem@root.cz" až k "predzavinacem@zazavinacem.domena" atd. s tim, že se popíší výše uvedené množiny znaků jednoduššími regulárními výrazy a ty se pak sečtou (lze tuto operaci na tělese reg. výrazů použít ? ;-)
cetl jsem vsechny prispevky a myslim ze do toho zacinam videt. co rikate na tuhle masku:
^[a-zA-Z0-9_+-]+(\.[a-zA-Z0-9_+-]+)*@((([a-zA-Z0-9_-]+\.)+[a-zA-Z0-9]{2,})|(([0-9]{1,3}\.){3}[[0-9]{1,3}))$
- akceptuje "_", "+", "-" v casti pred zavinacem
- akceptuje vice casti jmena pred zavinacem (oddelenych "." )
- akceptuje viceurovnovou domenu nebo ip adresu
- myslim ze je to maska docela pouzitelna pro hrube odfiltrovani vylozene neplatnych emailovych adres
-jj-