Jump to content
vladiii

Expresii regulate

Recommended Posts

Posted

Expresii regulate in PHP

Salut! In aceasta lectie vom invata despre expresiile regulate in PHP, folosite de obicei pentru functiile preg_match si preg_match_all (http://us.php.net/manual/ro/function.preg-match-all.php).Ce este o expresie regulata ? O expresie regulata (regexp) reprezinta un text special, un sablon, care descrie un anumit text. Ce reprezinta aceste functii ? Cauta intr-un anumit string un anumit “substring”, echivalentul expresiei care am format-o daca il pot denumi asa si afiseaza toate “potrivirile” posibile intr-un array. Sintaxa functiei preg_match_all este urmatoarea:


preg_match_all(“expresia regulata”, "stringul in care cautam echivalentul expresiei", $var, PREG_SET_ORDER);

Variabila $var primeste rezultatele, iar ele vor fi afisate sub forma unui array. Insa pe noi nu asta ne intereseaza, ci “expresia regulate” in sine.

In primul rand, sa analizam 2 simboluri destul de importante:

- “^inceput” – cauta fiecare substring care contine la inceputul acestuia cuvantul: inceput. Deci, practic, ^ semnifica inceputul unui substring (cauta la inceput).

- “sfarsit$” – cauta fiecare substring care contine la sfarsitul acestuia cuvantul: sfarsit. Deci, practice, $ semnifica sfarsitul unui substring (cauta la sfarsit).

In concluzie, ca sa cautam un substring care contine la inceputul acestuia grupul “mama”, iar la sfarsit tot grupul “mama”, in interiorul stringului “mamaestemama”, vom folosi expresia regulata: “^mama$”.

Pana sa ajungem sa construim expresii regulate de la cap la coada, trebuie sa mai invatam despre cateva “caractere speciale”, fiecare avand un rol bine stabilit si foarte important. Sa vedem:

- “xy*” – gaseste orice substring care are dupa x, 0 sau mai multi de y (ex: “x”, “xy”, “xyy”, “xyyy”, “xyyyy”, etc.).

- “xy+” – gaseste orice substring care are dupa x cel putin un y (ex: “xy”, “xyy”, “xyyy”, “xyyyy”, etc.).

- “xy{3} – gaseste orice substring care are dupa x, exact 3 de y (“xyyy”).

- “xy{2,5}” – gaseste orice substring care contine dupa x, intre 2 si 5 de y (ex: “xyy”, “xyyy”, “xyyyy”, “xyyyyy”).

- “xy{3,}” – gaseste orice substring care are dupa x cel putin 3 de y (ex: “xyyy”, “xyyyy”, “xyyyyy”, “xyyyyyy”, etc.).

- “xy?” – “poate sa fie sau sa nu fie J”.

De asemenea, putem utiliza si secvente de caractere in interiorul expresiei regulate, aceste secvente fiind puse intotdeauna intre paranteze: (secv) . Exemplu: asd(ex){2,5}. Acest exemplu gaseste orice substring de forma: asdexex, asdexexex, asdexexexex, asdexexexexex.

Un alt semn foarte important este reprezentat de caracterul |. Exemplu: “eu|tu”, gaseste orice substring care are in componenta eu sau tu. | = OR (la fel ca in C++). Spre exemplu: “^eu|tu” gaseste orice substring care incepe cu eu, sau cu tu.

Punctul: “.” reprezinta un caracter. Orice caracter… Sa consideram urmatorul exemplu: “.(asd){2,5}”. Acesta cauta substringuri care contin caractere de forma: “Xasdasd” sau “Masdasdasd”, etc.

Perechea de paranteze drepte [ ] este asemanatoare cu | . Spre exemplu, “[ab]” este echivalent cu “a|b”. Insa, daca am vrea ca stringul ca contina o cifra, ar trebuie sa scriem o expresie de genul: “0|1|2|3|4|5|6|7|8|9”, insa ia prea mult timp. Acea expresie poate fi inlocuita cu foarte simplista: “[0-9]”. Daca vrem ca substringul sa contina o litera mica de la a la z, folosim: “[a-z]”, daca vrem sa contina o litera mare, tot de la A la Z, folosim: “[A-Z]”. Insa, daca vrem sa folosim si litere mari si litere mici ? Nimic mai simplu: “[a-zA-Z]”. Daca spre exemplu, vrem sa gasim un string care reprezinta un procent (de genul 99%), folosim urmatoarea expresie: “^[1-9][0-9]%$”.

Acum ca am explicat in mare cam ce face fiecare semn important, sa trecem la lucrurile seriose J.

1) Gasirea unei adrese IP valide. O adresa IP este de forma 172.178.25.43. Mai exact, este formata din 4 grupe de maxim 3 caractere si minim 1, cu valori intre 0 si 255. Evident, in expresia noastra regulate vom folosi si . (punct), caracterul care delimiteaza cele 4 grupe. Dar, cum am precizat mai sus, punctul reprezinta un caracter, de aceea trebuie sa “scapam” oarecum de aceasta notatie. Vom da “escape” la punct, folosind caracterul backslash, ex: “\.” sau “mamaia\.”.

Expresia regulata care cauta o adresa IP valida ar fi urmatoarea:


“\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b”

Poate ati observat, aici am folosit caracterul \b, care semnifica backspace.

2) Gasirea unui numar de telefon. Sa presupunem ca avem un numar de telefon de genul XX-YYYYYY si vrem sa-l gasim. Un astfel de numar este: 11-123456. Expresia regulate ar fi de genul:


“^[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9]$”

3) Gasirea unei adrese de e-mail. Nu ma voi complica si voi prezenta un cod simplu de gasire a adresei de e-mail, nu prea complet si prea “sigur”.


/[-a-z0-9\._]+@[-a-z0-9\._]+\.[a-z]{2,4}/

De ce spun ca aceasta expresia nu este prea safe ? Pentru ca un string de genul: asdasd@asdasd.asd il va considera ca fiind o adresa valida de e-mail, desi nu prea este J

Cam atat ! Sper ca este de folos cu ceva tutorialul asta ! Cand am scris acest tutorial am invatat si eu, in acelasi timp cu voi, ce sunt alea expresii regulate, deci daca sunt greseli, post them !!!

Bibliografie:


[url]http://www.regular-expressions.info/[/url]

@vladii 2007

Posted


/[-a-z0-9\._]+@[-a-z0-9\._]+\.[a-z]{2,4}/

... la validarea e-mailului ... ca sa fie mai corect punem:


/[-a-z0-9\._]+@[-a-z0-9\._]+\.[a-z]{2,6}/

pt ca sunt si domenii gen .museum .... felicitari pt tutorial .... f bine explicat ..tinand cont de faptul ca expresiile regulate sunt un pic mai complexe ....

bafta in continuare ......

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...