miffmedia.com

Š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.

RegEx 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

Komentar: