PHP kurs: Uvod u regularne izraze Bez obzira na prirodu projekta na kome radite, pre ili kasnije doći ćete u situaciju da morate manipulisati nekim tekstualnim podacima. Bilo da je u pitanju jednostavna validacija forme ili pak parsovanje podataka sa nekog live sajta, regularni izrazi (eng. Regular Expressions) su oruđe kojim morate ovladati da bi ste bili uspešni u tome. 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: 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 nijednom ili više puta (za pattern "ab*" odgovaralo bi "a", "ab", "abb", "abbb", ...) + - Karakter koji prethodi znaku '+' može se pojaviti jedanput 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 tačno jednog 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. 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.