Autor:
Dragan Dinić
Nivo teksta: Srednji
O važnosti regularnih izraza dovoljno govori činjenica da je podrška za njih prisutna u svim modernim programskim jezicima (u Perlu su čak deo samog jezika), a možete ih koristiti i u većini naprednih tekst editora, alatima za pretragu itd.
Potpuno ovladavanje regularnim izrazima nije nešto što možete "odraditi" preko noći, šta više, tema je toliko opširna da je o njoj napisano i nekoliko knjiga. Cilj ovog tutorijala je da vas upozna sa osnovnim mogućnostima regularnih izraza kako biste bili u mogućnosti da ih efikasno koristite.
Šta su to regularni izrazi
Regularni izraz praktično predstavlja poseban skup znakova (string) u kome se odgovarajućom sintaksom (eng. pattern) taj niz upoređuje sa nekim drugim skupom znakova. Može se koristiti za pretragu unutar nekog teksta, izvlačenje određenog podstringa, validaciju (e-maila na primer) i sl. Možda sve ovo zvuči komplikovano, ali će stvar biti mnogo jasnija, čim krenemo sa nekoliko primera.
PHP podržava takozvane
POSIX kao i
Perl Kompatibilne regularne izraze. Iako među njima postoje izvesne razlike, osnovna sintaksa je u suštini ista, tako da ćemo sintaksu predstavljenu ovde koristiti i sa posix i sa perl kompatibilnim funkcijama. Inače, iako su primeri u PHP-u, oni se uz manje izmene mogu prilagoditi i drugim programskim jezicima, jer je sintaksa regularnih izraza manje više ista.
Sintaksa Regularnih Izraza
Prva dva specijalna karaktera sa kojima ćemo početi su '^' i '$'. Oni označavaju početak, odnosno kraj stringa. Tako na primer:
"^foo" - proverava da li string počinje sa "foo"
"foo$' - proverava da li se string završava sa "foo"
Recimo ako imamo string "Mali Perica uci PHP", rečnikom PHP-a to bi izgledalo ovako:
<code>
<?php
$string = "Mali Perica uci PHP";
// Vraca true ako se string "Perica" nalazi u promenljivoj $string
ereg("Perica", $string);
// Vraca true ako $string pocinje sa "Mali"
ereg("^Mali", $string);
// Vraca true ako se $string zavrsava sa "PHP"
ereg("PHP$", $string);
// Vraca true ako string sadrzi tacnu frazu "Mali Perica uci PHP"
ereg("^Mali Perica uci PHP$", $string);
?>
</code>
U kodu gore koristili smo
ereg f-ju, koja spada u grupu Posix kompatibilnih f-ja. Obratite pažnju da je ona 'case-senzitivna' (za case-insensitive koristite funkciju
eregi).
Simboli '?', '+', '*' i {} označavaju broj pojavljivanja nekog karaktera u stringu:
? - Karakter koji prethodi znaku '?' može se pojaviti jednom ili nijednom
(za pattern "ab?" odgovaralo bi "a","ab")
* - Karakter koji prethodi znaku '*' može se pojaviti <strong>nijednom</strong> ili više puta (za pattern "ab*" odgovaralo bi "a", "ab", "abb", "abbb", ...)
+ - Karakter koji prethodi znaku '+' može se pojaviti <strong>jedanput</strong> ili više puta
(za pattern "ab*" odgovaralo bi "ab", "abb", "abbb", ...)
{n} - Karakter koji prethodi znaku {n} može se pojaviti tačno n puta
(za pattern "ab{3}" odgovaralo bi "abbb")
{n, } - Karakter koji prethodi znaku {n, } može se pojaviti najmanje n puta
(za pattern "ab{3,}" odgovaralo bi "abbb", "abbbb", "abbbb", ...)
{n,m} - Karakter koji prethodi znaku {n,m} može se pojaviti n do m puta.
(za pattern "ab{2,4}" odgovaralo bi "abb", "abbb", "abbbb")
Pored broja pojavljivanja, mozemo definisati i tačan skup znakova koje string sme da sadrži. Na primer:
'.' - Bilo koji karakter
[abc] - Samo slova a, b i c
[a-z] - Sva mala slova od a do z
[A-Z] - Sva velika slova od A do Z
[a-zA-z] - Sva slova, mala ili velika
[0-9] - Svi brojevi od 0 - 9
[a-zA-Z0-9] Svi alfanumericki karakteri
Unutar zagrada [] simbol '^' koristimo kao negaciju, tako na primer, ako želimo da naš string ne sadrži brojeve koristili bi nešto poput:
[^0-9].
Pored skupova znakova koje sami definišemo, postoje već predefinisani skupovi znakova, a to su:
[[:alnum:]] - Bilo koji alfanumerički karakter (isto što i [a-zA-Z0-9])
[[:alpha:]] - Bilo koje slovo (isto što i [a-zA-Z])
[[:upper:]] - Bilo koje veliko slovo (isto što i [A-Z])
[[:lower:]] - Bilo koje malo slovo (isto što i [a-z])
[[:blank:]] - Tab i space karakter (isto što i [\t ])
[[:space:]] - Bilo koji space karakter
[[:digit:]] - Bilo koji broj (isto što i [0-9])
[[:xdigit:]] - Bilo koji heksadecimalan broj
[[:punct:]] - Bilo koji od znakova ".,"'?!;:"
[[:print:]] - Svi printabilni karakteri
[[:graph:]] - Svi printabilni karakteri (osim spaceova)
I poslednje ali ne i najmanje bitno, izbor od <string>tačno
jednog</string> elementa iz definisanog skupa:
(string1|string2|...|stringn)
Na primer za pattern "(a|b)cde" stringovi "acde" i "bcde" bi bili
odgovarajući. Takođe, zagrade možemo koristiti za pravljenje
"subpatterna", poput "ba(na)+" ("bana","banana","bananana", ...).
Toliko o teoriji, a sada da vidimo kako regularne izraze upotrebiti u
praksi, za recimo validaciju forme.
<code>
<?php
// validacija korisnickog imena
// dozvoljavamo samo korisnicko ime koje sadrzi alfanum i donju crtu
// minimum 6, max 20 karaktera
$found = preg_match("/^[a-zA-Z0-9_]{6,20}$/", $username);
if(!$found)
{
echo "Korisnicko ime nije validno";
}
// validacija telefona
// prihvatamo samo brojeve i karaktere iz skupa [+/()]
//obratite paznju na koriscenje escape karaktera "\" za '.', '/', '(' i ')'
$found = preg_match("/^[0-9+\-\.\/\(\) ]{6,30}$/", $phonenum);
if(!$found)
{
echo "Telefon nije validan";
}
//validacija datuma u mysql formatu (YYYY-MM-DD)
$found = preg_match("/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/", $datum);
if(!$found)
{
echo "Datum nije validan";
}
// validacija usa zip koda
// USA zipocode je u formatu xxxxx ili xxxxx-xxxx
// gde je x bilo koji ceo broj
// na primer 12345 ili 12345-1234
$found = preg_match("/^([0-9]{5}|([0-9]{5}-[0-9]{4}))$/", $datum);
if(!$found)
{
echo "Zipcode nije validan";
}
// jednostavna validacija emaila
$found = preg_match(
"/^[a-zA-Z0-9\.\-]+@[a-zA-Z0-9\.\-]+$/", $datum);
if(!$found)
{
echo "e-mail nije validan";
}
?>
</code>
Uskoro sledi nastavak, sa objašnjenjem na praktičnom primeru. Konkretno, bićete u prilici da pročitate case study na temu parsiranja srpskih blogova.
Dragan Dinić je 32-godišnji Web programer sa preko 5 godina iskustva u razvoju LAMP based aplikacija. U slobodno vreme Dragan vodi svoj blog ili diskutuje o Internet tehnologijama na raznim Web forumima.
Ovo je arhivirana verzija originalne stranice. Izvinjavamo se ukoliko, usled tehničkih ograničenja,
stranica i njen sadržaj ne odgovaraju originalnoj verziji.
Komentari 3
Pogledaj komentare