Expresii regulate în limbajul PHP
IntroducereCăutarea și identificarea anumitor secvențe într-un text a fost, este și va fi o problemă foarte importantă în informatică. Acest articol se va opri doar asupra problemelor de căutare utilizand expresii regulate compatibile Perl în limbajul de programare PHP. O expresie regulată este o secvența de caractere cu rol de șablon (pattern). Acest sablon se aplica peste un subiect (un sir de caractere) pentru a extrage toate subsirurile care au aceeasi structura cu sablonul definit. Exemplu: [0-9]+ - orice insiruire de cifre - fiind aplicat peste sirul 12as323n2131nnk$#,m23&*K va extrage: 12, 323, 2131, 23 PHP este capabil sa interpreteze 2 standarde: PCRE si POSIX. In cele ce urmeaza prezentam doar standardul PCRE - Perl-compatible Regular Expressions. Caractere speciale
Exemple
Expresii Regulate in PHPPentru a fi capabil sa lucreze cu PCRE, PHP trebuie sa fi fost compilat cu --with-pcre-regex PCRE fiind o librarie externa, conteaza foarte mult si versiune ce o avem instalata pe sistem, existand diferente atat de sintaxa cat si de performanta de la o versiunea la alta. O expresie regulata trebuie inclusa intre delimitatori. De exemplu, in aceasta prezentare, folosim ' / ' pe post de delimitator, nefiind un caracter special, dar care trebuie trebuie scos din contextul uzual in momentul în care il folosim in interiorul expresiei. Exemplu: /[a-z]+/i Modificatori de pattern
Setul de functii PHPpreg_grep — Returneaza un vector cu rezultatele interpretarii preg_last_error — Returneaza codul de eroare al ultimei expresii regulate executate preg_match_all — Cauta in subiect toate interpretarile expresiei regulate si returneaza un vector cu rezultatele gasite. preg_match — Cauta in subiect prima potrivire a expresiei regulate preg_quote — Scoate din context caracterele speciale preg_replace_callback — Aplica o functie de tip callback peste rezultatul un cautari si inlocuiri preg_replace — Executa o cautare si inlocuieste rezultatele preg_split — Desparte un sir in subsiruri Constante predefinitePREG_PATTERN_ORDER PREG_SET_ORDER PREG_OFFSET_CAPTURE PREG_SPLIT_NO_EMPTY PREG_SPLIT_DELIM_CAPTURE PREG_SPLIT_OFFSET_CAPTURE Constante returnate de preg_last_error()Aceste constante sunt disponibile doar din PHP 5.2.0 PREG_NO_ERROR - Returnat in cazul în care nu au fost erori de parsare PREG_INTERNAL_ERROR - Returnat in cazul unei erori interne PCRE PREG_BACKTRACK_LIMIT_ERROR - Returnata in cazul depasirii pcre.backtrack_limit (numarul maxim de pasi) PREG_RECURSION_LIMIT_ERROR - Returnata in cazul depasirii pcre.recursion_limit (cantitatea maxima de informatie pastrata pe stiva) PREG_BAD_UTF8_ERROR - Returnat in cazul parsarii in mod UTF-8 cand intalneste o portiune de text necorespunzatoare standardului UTF-8 preg_match()int preg_match (string $pattern, string $subject [, array &$matches [, int $flags [, int $offset]]]) preg_match cauta prima aparitie a patternului in $subject. Valoare returnata poate fi:
FlaguriPREG_OFFSET_CAPTURE - In acest caz, in vectorul $matches este returnat primul subsir din $subject care valideaza expresia regulata. Exemplu$subject = "Statia cu numarul 12 a fost deschisa la ora 10 si 45 de minute";
preg_match('/[0-9]+/', $subject, $matches, PREG_OFFSET_CAPTURE, 19);
print_r($matches);
preg_match_all()int preg_match_all (string $pattern, string $subject, array &$matches [, int $flags [, int $offset]]) preg_match cauta toate aparitiile patternului in $subject. Valoare returnata poate fi:
$matches
FlaguriPREG_PATTERN_ORDER
PREG_SET_ORDER
PREG_OFFSET_CAPTURE - Are acelasi comportament cu PREG_PATTERN_ORDER dar returneaza si pozitia de start a subsirului Exemplu$subject = "Statia cu numarul 12 a fost deschisa la ora 10 si 45 de minute";
preg_match_all('/([a-z]{4,6})|([0-9]+)/i', $subject, $matches, PREG_PATTERN_ORDER);
print_r($matches);
preg_split()array preg_split (string $pattern, string $subject [, int $limit [, int $flags]]) Returneaza un vector cu subsiruri delimitate de patternuri. Numarul de elemente rezultate poate fi limitat la o anumita valoare. Pentru a obtine toate valorile setam limita la -1. FlaguriPREG_SPLIT_NO_EMPTY - Returneaza doar subsirurile nevide PREG_SPLIT_DELIM_CAPTURE - In cazul în care folosim un subpattern, stringul obtinut prin aplicarea respectivului pattern este returnat si el PREG_SPLIT_OFFSET_CAPTURE - Este folosit pentru a returna si pozitiile fiecarui substring returnat in rezultat Exemplu$subject = "Statia cu numarul 12 a fost deschisa la ora 10 si 45 de minute";
$matches = preg_split('/([0-9]+)/i', $subject, -1, PREG_SPLIT_OFFSET_CAPTURE);
print_r($matches);
preg_replace()mixed preg_replace ( mixed $pattern, mixed $replacement, mixed $subject [, int $limit [, int &$count]] ) Cauta si inlocuieste in $subject un set de patternuri. Exemplu$subject = "Stația cu numărul 12 a fost deschisa la ora 10 si 45 de minute";
$matches = preg_replace('/([a-z]+) ([0-9]+)/i', "$2 $1", $subject);
print_r($matches);
FinalAcest articol a fost creat avand ca scop principal familiarizarea tinerilor programatori cu folosirea PCRE. În prezent se lucrează la o nouă versiune care să cuprindă informatii ceva mai detaliate și să abordeze si subiecte complexe gen recursivitate. Orice sugestie este binevenită. Referințe |