Ez ilyen tematikus poszt, én szóltam.
Szóval vannak a
reguláris kifejezések.
Ezek arra jók, hogy gyorsan tudjunk adatfeldolgozni. Szöveget, pontosabban karaktersorozatokat, bármit. Persze akár egy bináris adatcsomag is feldolgozható, csak egyszerűen 0-k és 1-esek karaktersorozatának kell tekinteni, tehát nagyon okos dolog lehet ez a regexp (regular expressions, röviden), ha már ennyi mindent megeszik, nem?
Dehogynem. Például ha elmegyünk a kedvenc oldalunkra és regisztrálunk, akkor bekérnek olyanokat, hogy név, meg jelszó, meg ímélcím, stb... és ugye most, hogy elkezdtek a kínaiak is internetezni, nincs elég kínai, hogy kézzel ellenőrizzék a felhasználók által bepötyögött adatokat, tehát maradt a regexp.
Ha azt mondom, hogy
/[a-z0-9+._-]+@([a-z0-9-]+\.)+hu/i, akkor mindenki megijed és szanaszéjjel futkos, aztán megnyugszik, bevesz még egy adag Vicodint és..
úgy kezdődik, hogy
/, ez azért kell, hogy valamivel jeleznünk kell a feldolgozónak, hogy hát, mi akkor most kezdenénk, és majd ezzel szeretnénk befejezni is. Ez a karakter bármi lehet tudtommal, tehát akár azt is írhattam volna, hogy
@[a-z0-9+._-]+\@([a-z0-9-]+\.)+hu@i csakhogy a szemfüles tapsikóderek már észre is veszik, hogy akkor a középen megbúvó kukac elé került egy per. Azért, mert hát, ha azt mondom, hogy szeretnék kukaccal kezdeni és zárni, akkor nehogy már véletlenül kiejtem a számon, hogy szarkukac és puff lezárult a móka, pedig én nem arra a kukacra gondoltam. Azaz, a regexp delimiter (határoló) a kifejezés belsejében eszképelendő (a
\ speciális karakterrel, nem összekeverendő a másikkal, ami ugye a rendes
per, ez meg a
visszaper).
Még igazából semmiről nem volt szó, de már mennyit írtam? Hálás egy téma, nem? :D
[a-z0-9+._-] .. jaj! Meg kell ijedni (nem is), mert ez egy karakterosztály, ami pedig olyan, hogy amik a
[ és a
] közé esik, azt így elfogadja. Na igen, mivel most olyan ímélcmeket akarunk elfogadni csak, amik
.hu-val végződnek, és
csak az angol ábécé betűi, számjegyek, a pont, a plusz, a mínusz és az aláhúzás jel van a kukac előtt, utána meg az, ami egy átlag domain névben lehet.
Tehát ez a karakterosztály pontosan ezt valósítja meg (mármint a kukac előtti részre vonatkozó szabályokat). Az
a-z azt jelenti, hogy A-tól Z-ig kisbetűk, a
0-9 meg hogy számjegyek, a többi meg önmaga. Arra kell figyelni, hogy a kötőjel/mínusz lehetőleg ne kavarjon be, hiszen egyrészt jelképezheti önmagát is, meg jelképezhet karaktertartományokat is, mint az a-z il.. 0-9 esetében. Akkor nem kavar be, ha a végén van vagy az elején.
Jön a kukac. Az egy kukac. Tehát minden, ami nem speciális karakter, az önmaga. Ez a szabály túl egyszerű, ebből van a legtöbb galiba általában :)
Aztán ott a másik karakterosztály, a kukac után egészen a
hu-ig. Van még ott egy pötty is, (a pont) speciális karakter, ezért ki kell eszképelni, a
\ jellel. Ha csak úgy önmagában állna egy árva pont, akkor az egy ilyen dzsóker jel lenne, ami bármi lehet, betű, számjegy, szóköz, kötőjel, per, vissza per, kettőspont, µ, ´, ¶, €, stb..
A keresztről, pontosabban összeadás ill. plusz jelről még nem volt szó. Na, az olyan, hogy ugye ha megadunk egy karakterosztályt, akkor az illeszkedik egy karakterre, viszont az ímélcímek nem olyanok, hogy a@b.hu, ezért szeretnénk, hogy mondjuk illeszkedjen hosszabb karakterláncokra is. Tehát teszünk egy
+ jelet. Ami azt jelenti, hogy egyszer vagy többször. Ismétli az előtte álló dolgot.
Ott a zárójel, amiben van a domain meg a pontunk. A zárójel után is van plusz. Azért, mert ugye vannak al-domainek. Meg al-al-domainek. Meg al-al-al-domainek.. meg al-al-al-al .. na szóval értitek. Tehát a zárójel egy csoportot jelöl, ha jól tudom, és azt is lehet ismételni.
Van még egy fifi, árva
i a végén. Az meg azért van, mert észrevettük, hogy "Jaj, Tibi, hát mi lesz azokkal a kínaiakkal, akiknek a nevében mondjuk van nagybetű és nem tudják, hogy az emailcímek érzéketlenek a kapitalizációra?!". Hát Tibikém, az lesz, hogy odateszünk egy kis i-t a dolog végére, hogy jelölje, hogy
case insensitive.
Ez a kis szösszenet itt a PCRE-nek megfelelő "szabvány" alapján van magyarázva. Azaz a perl compatible regular expressions, azaz perl kompatibilis szab. kif., mert a Perl féle eléggé-nagyon elterjedt, aztán ezt érdemes használni a PHP esetén is, és mondjuk valami ilyesmi van a JavaScript-ben is, meg az Apache is ezt használja pl. a mod_rewrite-ban.
Igen, végül, ami miatt az egészet bepötyögtem: végtelenül
bonyolult reguláris kifejezések.
Mert épp ilyeneket gyártottam és az egyik egész szépen sikerült után megörültem, hogy hú, de ügyes vagyok, most már egész jól tudom az ilyen nagy és hosszú izéket is kezelni.
Hát, rájöttem, hogy azért még van hova fejlődni :]