PHP si expresiile regulate (partea II) – prescurtari, interpretarea regex “lenesa”

Created at: iulie 12, 2013; Last update: noiembrie 1, 2013

In prima parte a acestui tutorial v-am mentionat cratima ca metacaracter. Aceasta, pusa in cadrul unui sir de caractere cuprins intre [ si ], indica o plaja de caractere posibile. Astfel, daca punem in regex [a-z], aceasta echivaleaza cu orice caracter alfabetic, de la a la z; daca punem in regex [0-9], aceasta echivaleaza cu orice caracter numeric, de la 0 la 9 etc.

Dar exista si alte modalitati prin care poti reprezenta caractere alfabetice sau alfanumerice.

Prescurtari pentru seturile de caractere

\d reprezinta cifra, fiind echivalentul setului de caractere [0-9]

\w reprezinta un caracter alfanumeric sau linie de unire, fiind echivalentul setului de caractere [a-zA-Z0-9_]

\s reprezinta spatiul gol (includem aici si tab-ul si liniile noi), fiind echivalentul setului de caractere [ \t\r\n]

\D reprezinta ABSENTA cifrei, fiind echivalentul setului de caractere [^0-9]

\W reprezinta ABSENTA caracterului alfanumeric, cratimei sau liniei de unire, fiind echivalentul setului de caractere [^a-zA-Z0-9_]

\S reprezinta ABSENTA spatiului gol, fiind echivalentul setului de caractere [^ \t\r\n]

Trebuie sa fii atent la prescurtarile realizate cu litere mari, pentru ca lucrul cu aceste prescurtari este mai greu de inteles.

Expresiile “lenese”

Regex are ca filosofie conformarea la o cantitate cat mai mare de obiecte returnate. Cu alte cuvinte, in momentul in care scrii un pattern, acesta este “calic”, este facut sa caute cea mai mare cantitate de caractere care se conformeaza.

Totusi exista un metacaracter care obliga celelalte metacaractere sa fie “lenese” adica sa permita celorlalte expresii (ulterioare expresiei in cauza) sa fie interpretate.

Acest metacaracter este semnul intrebarii “?”. El poate fi pozitionat dupa metacaracterul pe care il vrem “lenes”. Spre exemplu:

*?

Exemplu: /\w*?\d{3}/ – pus inaintea asteriscului, semnul intrebarii obliga pattern-ul sa prefere segmentele care nu au niciun caracter alfanumeric in fata. Astfel, expresia ar accepta si un segment de trei cifre, fara niciun caracter alfanumeric in fata.

+?

Exemplu: /[A-Za-z-]+?\./ – Plusul spune motorului regex ca accepta ca unul sau mai multe dintre caracterele aflate intre paranteze patrate poate sa apara in secventa de text. Semnul intrebarii insa, pus dupa “+” atentioneaza motorul de cautare sa prefere aparitia o singura data a oricarui caracter din setul de caractere dintre paranteze patrate.

{min,max}?

Exemplu: /.{4,8}?_.{4,8}/ – Semnul intrebarii aflat dupa acolade va indemna motorul regex sa prefere secventele de text care au un minim de patru caractere, celor care au un maxim de 8 caractere inainte de linia de unire.

??

Exemplu: /apples??/ – primul semn de intrebare arata ca un caracter “s” poate aparea de zero ori sau o data. Daca nu ar fi existat al doilea semn de intrebare, expresia ar fi fost “calica”, adica ar fi preferat mai degraba sa gaseasca pattern-ul care are un “s” in coada. Acum, al doilea semn de intrebare va spune ca este preferat pattern-ul care are zero caractere “s” in coada.

Nu stiu daca te-a multumit aceasta explicatie, ea putand fi inteleasa mai degraba prin exemple… As dori sa te indrum catre un tutorial PLATIT, realizat de Lynda.com: http://www.lynda.com/Regular-Expressions-training-tutorials/1066-0.html. Cursul este realizat de Kevin Skoglund, un foarte bun indrumator in ale programarii.

Lasă un răspuns

Your email address will not be published. Required fields are marked *

No spam? * Time limit is exhausted. Please reload CAPTCHA.