Pisano u PHP
Šta su i kako glasi definicija regularnih izraza najbolje je da potražite ovde (recimo).
Pokušaću da u što manje "tupljenja" objasnim kako je najbolje naučiti i koristiti regularne izraze u PHP-u.

slika je sa: http://shirtoid.com/17208/regular-expressions/
Primena
Primena je skoro u svakom projektu, dobar primer su forme tj unos podataka i provera istih. Lepo je to što može Javascript-om da se proveri unos, ispravi i opomene korisnik ali čarobno Disable JavaScript i podaci iz forme odoše takvi kavi (zlonamerni recimo...), i onda tu nastupa (server-side) kontrola.
$s = 'lisica';
echo preg_match("/ic/", $s); //echo: 1
echo preg_match("/IC/", $s); //echo: 0
U Na ovom primeru se se da zaključiti da: veličina jeste bitna (velika i mala slova prave razliku), string lisica ima u sebi ic ali nema IC, i da koristim PHP funkciju preg_match.
Meta-characters
Snaga regularnih izraza je u meta karakterima, meta karakteri su inače skup znakova sa specijalnim značenjem i to ne literalnim. Zvuči pomalo uf.. ali je ustvari baš prava definicija, cela zamisao oko izkaza je da se pomoću obrazca (pattern) pronađu podudaranja u određenom stringu. Upravo taj obrzac formiramo pomoću meta karaktera.
Caret (stepen) ^
Početak stringa
$s = 'lisica';
echo preg_match("/^li/", $s); //echo: 1
echo preg_match("/^is/", $s); //echo: 0
Inče caret ima još jednu primenu
Dollar (dolar, string) $
Kraj stringa
$s = 'lisica';
echo preg_match("/ica$/", $s); //echo: 1
echo preg_match("/isi$/", $s); //echo: 0
Character class (uglaste zagrade) []
U izrazima uglasta zagrada predstavlja klasu karaktera što bi značilo da je u pitanju set karaktera slično kao niz
$s = 'liga';
echo preg_match("/[aeiou]/", $s); //echo: 1
$s1 = 'laig';
echo preg_match("/[aoiu]/", $s1); //echo: 1
$s2 = 'lag';
echo preg_match("/l[aoiu]g/", $s2); //echo: 1
$s3 = 'leg';
echo preg_match("/l[aoiu]g/", $s3); //echo: 0
$s4 = 'laog';
echo preg_match("/l[aoiu]g/", $s4); //echo: 0
^ Caret znak se koristi za početak stringa ali ako se koristi u uglastim zagradama onda znaci NOT.
$s = 'lisica';
if(preg_match("/[^o]/",$s)) echo 'Nema znaka o.';
Da spomenem znak $ u uglastim zagradama nema nikakvog značaja, samo običan dolar znak.
U klasi karakteraa korisna stvar je range (raspon) i znak je - (minus), tako da [a-e] znači da se traže poklapanja po [abcde]
$s = 'lisica';
echo preg_match("/[a-z]/", $s); //echo: 1
$s1 = 'BraonLisicaSkace';
echo preg_match("/[a-z]/", $s1); //echo: 1
$s2 = 'LISICA';
echo preg_match("/[a-z]/", $s2); //echo: 0
$s3 = '12345';
echo preg_match("/[a-zA-Z]/", $s3); //echo: 0
$s4 = '12345';
echo preg_match("/[^0-9]/", $s4); //echo: 0
Dot (tačka) .
Jako prosto, označava sve karaktere izuzev nove linije.
$s = 'lisica';
echo preg_match("/./", $s); //echo: 1
$s1 = 'lisica';
echo preg_match("/[.]/", $s1); //echo: 0
$s2 = 'lis';
echo preg_match("/l.s/", $s2); //echo: 1
$s3 = 'lig';
echo preg_match("/l.e/", $s3); //echo: 0
$s4 = 'liis';
echo preg_match("/l.s/", $s4); //echo: 0
$s5 = "l\re";
echo preg_match("/l.e/", $s5); //echo: 1
$s6 = "l\ne";
echo preg_match("/l.e/", $s6); //echo: 0
Asterix (zvezdica) *
a* označava 0 ili više karaktera a, da bih pokazao korišćenje * napisaću malo komplikovaniji izraz:
$s = "<html>";
echo preg_match("/<[A-Za-z][A-Za-z0-9]*>/", $s); //echo: 1
$s1 = "<b>";
echo preg_match("/<[A-Za-z][A-Za-z0-9]*>/", $s1); //echo: 1
$s2 = "<h2>";
echo preg_match("/<[A-Za-z][A-Za-z0-9]*>/", $s2); //echo: 1
$s3 = "<2>";
echo preg_match("/<[A-Za-z][A-Za-z0-9]*>/", $s3); //echo: 0
Plus +
a+ označava jedno ili više karaktera a.
$s = "php";
echo preg_match("/ph+p/", $s); //echo: 1
$s1 = "phhp";
echo preg_match("/ph+p/", $s1); //echo: 1
$s2 = "pp";
echo preg_match("/ph+p/", $s2); //echo: 0
$s3 = "12345";
echo preg_match("/[a-z]+/", $s3); //echo: 0
Question mark (znak pitanja) ?
a? predstavlja 0 ili jedano poklapanje karaktera a.
$s = "123456";
echo preg_match("/123-?456/", $s); //echo: 1
$s1 = "123-456";
echo preg_match("/123-?456/", $s1); //echo: 1
$s2 = "123--456";
echo preg_match("/123-?456/", $s2); //echo: 0
Curly braces (velike zagrade) {}
a{2} tačno 2 karaktera a
a{2,} 2 ili više a
a{,2} do 2 karaktera a
a{2,5} od 2 do 5 karaktera a
$s = "google";
echo preg_match("/go{2}gle/", $s); //echo: 1
$s1 = "gooogle";
echo preg_match("/go{2}gle/", $s1); //echo: 0
$s2 = "gooogle";
echo preg_match("/go{2,}gle/", $s2); //echo: 1
$s3 = "google";
echo preg_match("/go{,2}gle/", $s3); //echo: 0
$s4 = "google";
echo preg_match("/go{2,3}gle/", $s4); //echo: 1
Subpattern (pod obrazac, zagrade) ()
$s = "Braon lisica skace.";
echo preg_match("/^(Braon)/", $s); //echo: 1
$s1 = "Crvena lisica skace.";
echo preg_match("/^(Braon)/", $s1); //echo: 0
$s2 = "Braon lisica skace.";
echo preg_match("/^([0-9])/", $s2); //echo: 0
$s3 = "13 je srecan broj.";
echo preg_match("/^([0-9])/", $s3); //echo: 1
Logical Or (pipe, uspravna crta) |
$s = "Braon lisica skace.";
echo preg_match("/^(Braon|Crvena)/", $s); //echo: 1
$s1 = "Crvena lisica skace.";
echo preg_match("/^(Braon|Crvena)/", $s1); //echo: 1
Backslash (naopaka kosa crta) \
Naopaka kosa crta se koristi u slučaju da ovih 11 meta karaktera želite da proverite kao string, moraćete da ih escape-ujete (izbegnete) sa znakom backslash.
$s = 'miffmedia.com';
if(preg_match("/\./",$s)) echo 'Postoji znak .';
$s1 = 'miffmedia+com';
if(preg_match("/\+/",$s1)) echo 'Postoji znak + .';
Upotreba
Ovo je sasvim dovoljno predznanje da napravite svoj PHP email validator koji ima iskaz:
^[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$
Gde svaka email adresa ima odrđeni format korisničko_ime @ domen . ekstenzija, tako da imamo izraze za korisničko ime: ^[a-zA-Z0-9._%-]+; domen: [a-zA-Z0-9.-]+ i za ekstenziju: [a-zA-Z]{2,4}.
Ovaj post sam najviše napisao zbog sebe samog, a vi koji ste zalutali možda i naučite nešto ili se podsetite... ;)
Reference:
http://www.regular-expressions.info/
http://php.net




Budi prvi i
Ostavi komentar