Mereu mi s-a parut o corvoada expresiile regulate (Regex = regular expressions), dar se pare ca asta este rezultatul negasirii unor tutoriale care sa te ia de la zero si apoi sa construiasca pe baza fiecarui nou pas.
Am gasit un tutorial care mi s-a parut foarte util pe TutsforWeb si consider ca ar fi o pierdere daca nu ar exista si o versiune in romana pentru acest tutorial.
Asadar, sa incepem cu inceputul. Ce sunt expresiile regulate? Conform definitiei Wikipedia…
O expresie regulata este o secventa de caractere cu rol de sablon (pattern). Acest sablon se aplica peste un subiect (un sir de caractere) pentru a extrage toate subsirurile care au aceeasi structura cu sablonul definit.
Prin urmare, vorbim de un sablon care, aplicat pe o secventa de text ar trebui sa returneze subsirurile care au structura sablonului:
Incepem cu un exemplu simplu:
<?php $string = "webinone"; echo preg_match("/in/", $string); ?>
Codul va returna 1 deoarece caracterele “in” se regasesc in sirul de caractere $string.
Codul de mai jos va returna 0.
<?php $string = "webinone"; echo preg_match("/ni/", $string); //output: 0 echo preg_match("/IN/", $string); //output: 0 ?>
Metacaracterele
Ridicare la putere – ^ (Caret in engleza)
Aflat la inceputul sablonului, ^ reprezinta “inceputul sirului”. Primul echo va returna 1 deoarece cauta in string ca secventa “we” sa se afle la inceputul acestuia.
<?php $string = 'webinone'; echo preg_match("/^we/", $string); //output: 1 echo preg_match("/^eb/", $string); //output: 0 ?>
Metacaracterul ^ are si o alta utilizare, despre care vom vorbi mai incolo.
Dolarul – $
Cauta in string ca la sfarsitul acestuia sa se afle un anumit sablon de caractere:
<?php $string = 'webinone'; echo preg_match("/one$/", $string); //output: 1 echo preg_match("/noe$/", $string); //output: 0 ?>
Caractere posibile – []
Verifica existenta caracterelor aflate intre parantezele patrate in string. Daca mai multe caractere se afla intre paranteze patrate, asta inseamna ca oricare UNUL dintre acele caractere poate sa fie continut in secventa de text in care se face cautarea. Cu alte cuvinte /gr[ea]y/ gaseste in secventa de text fie grey fie gray, dar nu greay sau graey. /gr[ea]t/ nu gaseste in secventa de text cuvantul /great/:
<?php $string = 'big'; echo preg_match("/[aeiou]/", $string); //Output: 1 $string1 = 'baig'; echo preg_match("/[aoiu]/", $string1); //Output: 1 $string2 = 'bag'; echo preg_match("/b[aoiu]g/", $string2); //Output: 1 $string3 = 'beg'; echo preg_match("/b[aoiu]g/", $string3); //Output: 0 $string4 = 'baog'; echo preg_match("/b[aoiu]g/", $string4); //Output: 0 ?>
Cratima – –
Cratima, in interiorul parantezelor patrate, este folosita pentru a expune o plaja de caractere. Astfel, cratima reprezinta toate caracterele aflate intre doua caractere. Metacaracterul “-” se aplica doar cand cratima se afla intre []: [0-9][A-Za-z]
Ridicare la putere intre paranteze patrate – [^]
Aflat intre paranteze patrate, inainte de enumerarea de caractere, simbolul ^ este de fapt o negatie: caracterele aflate intre paranteze patrate NU trebuie sa se regaseasca in string-ul de caractere.
<?php $string = 'webinone'; if(preg_match("/[^a]/",$string)) { echo 'String has no a.'; } ?>
Folosirea simbolului $ intre [], nu reprezinta sfarsitul stringului, ci doar simbolul $.
Intre paranteze patrate putem pune si un vector de caractere. Astfel, [a-f] este echivalentul [abcdef].
<?php $string = 'webinone'; echo preg_match("/[a-z]/", $string); //Output: 1 $string1 = 'WebInOne'; echo preg_match("/[a-z]/", $string1); //Output: 1 $string2 = 'WEBINONE'; echo preg_match("/[a-z]/", $string2); //Output: 0 $string3 = '12345'; echo preg_match("/[a-zA-Z]/", $string3); //Output: 0 $string4 = '12345'; echo preg_match("/[^0-9]/", $string4); //Output: 0 ?>
Punctul – .
Orice caracter singular cu exceptia unei linii noi (n).
<?php $string = 'one'; echo preg_match("/./", $string); //Output: 1 $string1 = 'one'; echo preg_match("/[.]/", $string1); //Output: 0 $string2 = 'one'; echo preg_match("/o.e/", $string2); //Output: 1 $string3 = 'ons'; echo preg_match("/o.e/", $string3); //Output: 0 $string4 = 'onne'; echo preg_match("/o.e/", $string4); //Output: 0 $string5 = "ore"; echo preg_match("/o.e/", $string5); //Output: 1 $string6 = "one"; echo preg_match("/o.e/", $string6); //Output: 0 ?>
Asterisc – *
a* inseamna 0 sau mai multe caractere a. De exemplu:
<?php $string = "<html>"; echo preg_match("/<[A-Za-z][A-Za-z0-9]*>/", $string); //Output: 1 $string1 = "<b>"; echo preg_match("/<[A-Za-z][A-Za-z0-9]*>/", $string1); //Output: 1 $string2 = "<h3>"; echo preg_match("/<[A-Za-z][A-Za-z0-9]*>/", $string2); //Output: 1 $string3 = "<3>"; echo preg_match("/<[A-Za-z][A-Za-z0-9]*>/", $string3); //Output: 0 ?>
Plus – +
a+ inseamna unul sau mai multe caractere a.
<?php $string = "php"; echo preg_match("/ph+p/", $string); //Output: 1 $string1 = "phhp"; echo preg_match("/ph+p/", $string1); //Output: 1 $string2 = "pp"; echo preg_match("/ph+p/", $string2); //Output: 0 $string3 = "12345"; echo preg_match("/[a-z]+/", $string3); //Output: 0 ?>
Semnul intrebarii – ?
Semnul intrebarii verifica daca caracterul (secventa) anterior apare de zero sau o data. Spre exemplu:
[hc]?at va aproba secventele de text “hat”, “cat” si “at”.
a? inseamna zero sau un caracter a.
<?php $string = "123456"; echo preg_match("/123-?456/", $string); //Output: 1 $string1 = "123-456"; echo preg_match("/123-?456/", $string1); //Output: 1 $string2 = "123--456"; echo preg_match("/123-?456/", $string2); //Output: 0 ?>
Acoladele – {}
a{3} Un numar de exact 3 caractere a
a{3,} 3 sau mai multe caractere a
a{,3} Pana la 3 caractere a
a{3,6} Intre 3 si 6 caractere a
<?php $string = "google"; echo preg_match("/go{2}gle/", $string); //Output: 1 $string1 = "gooogle"; echo preg_match("/go{2}gle/", $string1); //Output: 0 $string2 = "gooogle"; echo preg_match("/go{2,}gle/", $string2); //Output: 1 $string3 = "google"; echo preg_match("/go{,2}gle/", $string3); //Output: 0 $string4 = "google"; echo preg_match("/go{2,3}gle/", $string4); //Output: 1 ?>
Subpattern – ()
Gruparea (meta)caracterelor se face cu ajutorul parantezelor rotunde. Astfel, daca vrem sa aplicam metacaractere unui grup de (meta)caractere, facem asta cu ajutorul parantezelor rotunde.
Spre exemplu, /(abc)+/ gaseste unul sau mai multe grupuri de caractere “abc” intr-o secventa de text data.
/(ne)?placere/ gaseste secventa de caractere “neplacere” sau secventa “placere”.
<?php $string = "This is PHP."; echo preg_match("/^(This)/", $string); //Output: 1 $string1 = "That is PHP."; echo preg_match("/^(This)/", $string1); //Output: 0 $string2 = "That is PHP."; echo preg_match("/^([0-9])/", $string2); //Output: 0 $string3 = "7 is lucky number."; echo preg_match("/^([0-9])/", $string3); //Output: 1 ?>
Sau logic – |
<?php $string = "This is PHP."; echo preg_match("/^(This|That)/", $string); //Output: 1 $string1 = "That is PHP."; echo preg_match("/^(This|That)/", $string1); //Output: 1 ?>
Backslash – /
Backslash este folosit pentru a afisarea metacaracterelor in calitate de caractere literale in regex. Astfel, daca vrem sa folosim metacaracterele ^+*.?$()|[ in calitate de caractere literale, vom pune in fata lor un backslash.
<?php $string = 'webinone.net'; if(preg_match("/./",$string)) { echo 'String has dot.'; } $string1 = 'webinone+net'; if(preg_match("/+/",$string1)) { echo 'String has + sign.'; } ?>
[…] Link alternativ – Expresii regulate in PHP […]
Multumesc si eu pentru pingback.
Bun tutorial, multumim pentru efortul depus in scop benevol.