Sunteți pe pagina 1din 3

Expresii regulate

1. Scrierea expresiilor regulate (Regex)


Expresiile regulate (regex) sunt un şir de caractere sablon care descriu mulţimea cuvintelor posibile care pot fi
formate cu acele caractere, respectând anumite reguli. Aceste expresii regulate folosesc paranteze (rotunde,
pătrate, acolade) prin care formează regulile de formare a cuvintelor. Utilitatea cea mai frecventă a unei expresii
regulate constă în a recunoaşte dacă un şir conţine sau nu cuvinte sau sub-şir care pot fi formate prin expresia
regulată respectivă.
De ex.: expresia m[ai]r poate forma cuvintele: mar şi mir
Să presupunem că doriţi să specificaţi un şir care poate include orice vocală. Puteţi face aceasta folosind expresia
regulată [aeiou]. Prin includerea valorilor posibile între paranteze, formaţi o expresie regulată echivalentă cu
formularea "alege oricare din aceste valori". Dacă doriţi să permiteţi şi utilizarea, majusculelor, puteţi scrie
[aeiouAEIOU].
Să presupunem că doriţi să specificaţi un şir care poate include orice caracter scris cu minuscule. Puteţi scrie:
[abcdefghijklmnopqrstuvwxyz]. Sau puteţi folosi o formă mai compactă [a-z], unde prin cratima se înţelege "o serie
de caractere consecutive".
Să presupunem că doriţi să specificaţi într-o expresie regulată şirurile "sat", "mat" şi "lat". Pentru aceasta, aveţi
nevoie de expresia regulată [sml]at. Semnificaţia acestei expresii regulate este următoarea: "alege oricare din
literele 's', 'm' şi 'l' şi scrie după litera respectivă literele 'at'".
Dacă un accent circumflex (^) este primul simbol menţionat între parantezele drepte, acesta are ca efect
inversarea semnificaţiei expresiei regulate plasate între paranteze.
De exemplu, expresia regulată [^a-z] corespunde oricărui caracter care nu este o literă mică.
Pentru a specifica faptul că o expresie regulată se poate repeta, expresia regulată va fi urmată de o pereche de
acolade, care includ limitele superioară şi inferioară ale repetiţiei.
De exemplu, expresia regulată [aeiou]{1,4} corespunde şirurilor care pot conţine între 1 şi 4 vocale.
Pentru a specifica repetarea mai multor părţi ale unei expresii regulate, includeţi părţile respective între paranteze
rotunde.
De exemplu, expresia regulată ([sml]at){1 ,2} corespunde unui număr de una sau două repetări ale oricăruia
dintre şirurile "sat", "mat" sau "lat".
Pentru a simplifica scrierea de reguli într-o expresie regulată se folosesc anumite caractere "speciale"
Să presupunem că doriţi să reprezentaţi o înmulţire între două numere, puteţi obţine ceva de genul [0-9]*[0-9].
Totuşi, această expresie regulată nu are semnificaţia dorită, deoarece '*' este un factor de repetiţie, nu un caracter
dintr-un şir. Pentru a dezactiva semnificaţia specială a caracterului '*', trebuie să-l prefixaţi cu un caracter
backslash: [0-9]\*[0-9].
Pentru a specifica faptul că o expresie regulată corespunde numai unui sub-şir care include anumite caractere la
început, prefixaţi expresia regulată cu un accent circumflex "^". De exemplu, expresia regulată ^[sml]at
corespunde sub-şirurilor "sat", "mat" sau "lat" numai dacă acestea apar la începutul şirului subiect.
Similar, pentru a arăta că o expresie regulată corespunde numai unui sub-sir care include anumite caractere la
sfârşit, anexaţi la expresia regulată un simbol al dolarului "$". De exemplu, expresia regulată [sml]at$ corespunde
şirurilor "sat", "mat" sau "lat" numai dacă acestea apar la sfârşitul şirului subiect.
Iată o listă cu mai multe caractere speciale şi rolul lor în expresiile regulate:
^ - indică începutul liniei
$ - indică sfârşitul liniei
. - (punct) orice caracter
[] - un caracter dintre cele din paranezele pătrate
[^] - orice caracter, în afara celor din paranezele pătrate
\ - scoate din contextul formări expresiei caracterul care urmează
+ - caracterul (expresia) anterior acestui semn se poate repeta odată şi de câte ori e posibil (de la 1 la infinit)
* - caracterul (expresia) anterior acestui semn se poate repeta de câte ori e posibil sau niciodată (de la 0 la infinit)
? - caracterul (expresia) anterior acestui semn se poate repeta cel mult odată
<> - un cuvânt întreg
(|) - lista de opţiuni SAU
{m, n} - repetarea expresiei de la "m" la "n" ori
Iată câteva exemple de expresii regulate:
(.*) - Reprezintă toate caracterele (prin .) repetate de câte ori e posibil (dat de *)
<salut> - Cuvântul "salut"
(ci|co)tim - Reprezintă "citim" şi "cotim"
^The .* hack$ - Şirurile care încep cu "the " şi se sfârşesc cu " hack"
^www.[a-z0-9]+.ro$ - Reprezintă şirurile "www.---.ro" unde '---' poate fi orice literă sau cuvânt ce conţine litere
mici şi numere
(^-\+[0-9]*) - Orice număr care începe cu "-" sau "+"
^([a-zA-Z0-9]+[a-zA-Z0-9._%-]*@([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,4})$ - Expresie regulată pentru adrese de e-mail
1
2. Utilizarea expresiilor regulate
PHP include numeroase funcţii care lucrează cu expresii regulate. Tabelul următor descrie unele din aceste funcţii.

Funcţii PHP pentru expresii regulate


Funcţie Descriere
- Execută o identificare cu o expresie regulată (deprecată începând cu
ereg versiunea PHP 5.3 şi anulată la PHP 6 - în locul ei se poate folosi
preg_match)
- Înlocuieşte un sub-şir care corespunde unei expresii regulate (deprecată
ereg_replace începând cu versiunea PHP 5.3 şi anulată la PHP 6 - în locul ei poate fi
folosită preg_replace)
- Execută o identificare cu o expresie regulată insensibilă la diferenţa între
eregi majuscule şi minuscule (deprecată începând cu versiunea PHP 5.3 şi
anulată la PHP 6 - în locul ei se poate folosi preg_match)
- Înlocuieşte un sub-şir care corespunde unei expresii regulate insensibile la
eregi_replace diferenţa între majuscule şi minuscule (deprecată începând cu versiunea
PHP 5.3 şi anulată la PHP 6 - în locul ei poate fi folosită preg_replace)
- Caută în şir caracterele sau sablonul care se potriveşte cu expresia regulată
preg_replace
din funcţie şi o înlocuieşte cu alte valori date
- Divide un şir într-un tablou folosind o expresie regulată (deprecată
split începând cu versiunea PHP 5.3 şi anulată la PHP 6 - în locul ei poate fi
folosită preg_split)
- Crează o expresie regulată, insensibilă la diferenţa între majuscule şi
sql_regcase minuscule, dintr-un şir care conţine o expresie regulată (deprecată începând
cu versiunea PHP 5.3 şi anulată la PHP 6)
În continuare este dat un exemplu cu funcţia ereg().
Forma simplă a funcţiei ereg() preia două argumente: un şir care conţine o expresie regulată şi un şir subiect.
Funcţia returnează TRUE dacă expresia regulată corespunde unui sub-şir al şirului subiect; în caz contrar,
returnează FALSE.
- Iată un exemplu:

Cod:

<?php
$model = "[sml]at";
$subiect = "La noi in sat";
$rezultat = ereg($model, $subiect);
if ($rezultat) {
echo 'Model inclus in subiect';
}
?>
- În acest script, variabila $rezultat primeşte valoarea TRUE, deoarece şirul 'subiect' conţine sub-şirul "sat", care
corespunde expresiei regulate.
Pentru verificare, instrucţiunea "if" verifică dacă "$resultat" este TRUE şi în caz afirmativ execută comanda dintre
acolade, "echo" care afişează 'Model inclus in subiect'.
- Pentru a verifica dacă un şir conţine numai litere şi numere, puteţi folosi direct funcţia ctype_alnum()
- Deoarece funcţiile "ereg" au fost deprecate începând cu versiunea PHP 5.3 şi anulate din PHP 6, este indicat să
nu le mai folosiţi, cunoaşterea lor e necesară dacă le întâlniţi în scripturi mai vechi. Acestea au fost înlocuite cu
funcţii "preg_" (Perl-Compatible). Mai multe detalii şi exemple despre aceste funcţii găsiţi în manualul Expresii
regulate (compatibile Perl)
Expresiile regulate compatibile Perl se adaugă între caractere "/". De exemplu şablonul ([a-z0-9]+) se foloseşte /
([a-z0-9]+)/.
Iată un exemplu cu preg_grep(), aceasta returnează un array compus din elementele unei matrice care conţin
şablonul, expresia regulată căutată. Acest exemplu va returna doar acele elementele dintr-o matrice care conţin în
ele sub-şirurile "casa" sau "masa".

2
Cod:

<?php
$matrice = array('123casa', 'abc masa', '12-xy', '$asa_0/', '123abc casa');
$filtru = preg_grep("/([cm]asa)/", $matrice);

print_r ($filtru); // Afiseaza elementele matricei


?>
- Variabila "$matrice" conţine un Array cu mai multe elemente cu şiruri.
- În variabila $filtru e preluat rezultatul funcţiei "preg_grep()" a cărei prim parametru este un şablon de expresie
regulată (adăugată între ghilimele duble), iar al doilea este matricea în care e căutat şablonul.
- Cu funcţia "print_r()" se va afişa elementele matricei obţinute în variabila "$filtru". Rezultatul afişat e următorul:
Array ( [0]=>123casa [1]=>abc masa [4]=>123abc casa )
- Un ultim exemplu util, folosim funcţia preg_replace() şi o expresie regulată pentru a elimina caracterele speciale
dintr-un şir

Cod:

<?php
$sir = 'Sir& ce contine*a <caractere: speciale? /in co@nte>xt';
$sir = preg_replace("/([^ A-Za-z0-9_]+)/", "", $sir);
echo $sir;
?>
În acest exemplu avem un şir (stocat în variabila $sir) ce conţine diferite caractere mai puţin uzuale.
Funcţia "preg_replace", împreună cu expresia regulată "/(^ A-Za-z0-9_]+)/", păstrează în $sir numai literele,
cifrele, caracterul '_' şi spaţiu.
Instrucţiunea "echo" va afişa următorul rezultat:
Şir ce conţinea caractere speciale în context
Articol preluat de la www.marplo.net

S-ar putea să vă placă și