Lucrul cu siruri (1) 5

  • Învatati sa utilizati secvente escape suplimentare pentru a include în siruri caracterele speciale
  • învatati sa utilizati codurile ASCII
  • învatati sa creati date de iesire formatate

În Lectia 2 au fost prezentate sirurile, tipul de date PHP care stocheaza texte, în aceasta lectie veti învata mai multe despre utilizarea sirurilor.

1. Crearea si afisarea sirurilor

Sa recapitulam notiunile elementare ale sirurilor

  • Valorile de tip sir sunt secvente de caractere incluse între ghilimele duble sau simple
  • Puteti include un caracter special în cadrul unui sir folosind o secventa escape care reprezinta caracterul special.
  • Variabilele pot fi de tip string si li-se poate atribui o valoare de tip sir.
  • Operatorul de concatenare, punct, ( . ) se poate folosi pentru unirea sirurilor.
  • PHP poate converti în mod automat o valoare numerica într-un sir, respectiv valoarea unui sir într-un numar.


Secventele escape folosite în PHP:

  • \n – salt la linie noua
    \r – retur de car (rand nou)
    \t – caracter de tabulare pe orizontala
    \\ – backslash
    \$ – simbolul dolarului
    \” – ghilimele duble
    \xxx – caracterul asociat valorii ASCII xxx, exprimata sub forma unui numar in octal
    \xnn – caracterul asociat valorii ASCII xxx, exprimata sub forma unui numar în hexazecimal

2. Secvente escape si cod ASCII

Ultimele doua secvente escape prezentate mai sus folosec un cod ASCII (America Standard Code for Information Interchange) pentru reprezentarea unui caracter.
Codurile ASCII sunt valori întregi, care sunt cuprinse între 0 si 255; fiecare litera sau simbol folosit frecvent în limbile vest-europene are asociat un cod ASCII. De exemplu, codul ASCII asociat literei A este 65, iar codul asociat cifrei l este 49.
Prima secventa escape necunoscuta (\xxx) va permite sa folositi reprezentarea în octal (baza 8) a unui cod ASCII pentru specificarea caracterului corespunzator. De exemplu, valoarea zecimala 65 (care este codul ASCII al literei A) poate fi reprezentata în octal sub forma 101. Ca atare, puteti reprezenta litera A folosind secventa escape „\101”.
Cea de-a doua secventa escape necunoscuta (\xnn) va permite sa folositi reprezentarea hexazecimala (în baza 16) a unui cod ASCII pentru specificarea caracterului corespunzator. De exemplu, valoarea zecimala 65 (care este codul ASCII al literei A) poate fi reprezentat sub forma hexazecimala 41. Ca atare, puteti reprezenta litera A cu ajutorul secventei escape „\41”.
Valoarea unui numar zecimal este suma produselor dintre fiecare cifra care îl compune si o putere a lui 10. De exemplu, numarul zecimal 123 are valoarea l x 10 la puterea 2 + 2 x 10 la puterea 1 + 3 x 10 la puterea 0 = 1×100 + 2×10 + 3×1.
Puteti determina valoarea unui numar reprezentat folosind o alta baza prin înlocuirea lui 10 cu valoarea bazei respective într-o expresie ca aceea prezentata anterior. De exemplu, valoarea hexazecimala 123 este echivalenta cu valoarea zecimala l x 16 la puterea 2 + 2 x 16 la puterea 1 + 3 x 16 la puterea 0 = l x 156 + 2 x 16 + 3 x l = 291.
Similar, valoarea în octal 123 este echivalenta cu valoarea zecimala 1×8 la puterea 2 + 2×8 la puterea 1 + 3×8 la puterea 0 = 1×64 + 2×8 + 3xl=83.
Daca vi se pare complicat sa calculam astfel, nu intrati în panica; în continuare veti învata sa determinati valoarea în octal sau hexazecimal echivalenta cu orice valoare zecimala, folosind functii PHP.

3. Utilizarea codurilor ASCII

Numeroase functii PHP sunt deosebit de folositoare la utilizarea codurilor ASCII. Aceste functii sunt enumerate în tabelul urmator.

Functii folositoare în utilizarea codurilor ASCII
FunctieDescriere
chr(/n)– Returneaza caracterul având codul ASCII dat de „n”
dechex(n)– Returneaza valoarea hexazecimala echivalenta cu valoarea zecimala data de „n”
decoct(n)– Returneaza valoarea în octal echivalenta cu valoarea zecimala data de „n”
hexdec(n)– Returneaza valoarea zecimala echivalenta cu valoarea hexazecimala data de „n”
octdec(n)– Returneaza valoarea zecimala echivalenta cu valoarea în octal data de „n”
ord(c)– Returneaza codul ASCII echivalent caracterului „c”

Iata un exemplu de utilizare a functiei ord() pentru a determina codul ASCII corespunzator unui anumit caracter:

<?php
$c = „A”;
$n = ord($c);
echo „<br /> Valoarea ASCII a caracterului $c este $n”;
?>

Scriptul va afisa urmatorul rezultat:

Valoarea ASCII a caracterului A este 65

Iata un exemplu care afiseaza echivalentele în octal, respectiv hexazecimal al caracterelor ASCII ale caror coduri sunt cuprinse între 33 si 40:

<?php
for ($i=33; $i<40; $i++) {
        $c=chr($i);
        $octal = decoct($i);
        $hex = dechex($i);
        echo „<br /> $i (octal $octal, hex $hex): caracter – $c”;
}
?>

Scriptul va afisa urmatorul rezultat:

33 (octal 41, hex 21): caracter – !
34 (octal 42, hex 22): caracter – „
35 (octal 43, hex 23): caracter – #
36 (octal 44, hex 24): caracter – $
37 (octal 45, hex 25): caracter – %
38 (octal 46, hex 26): caracter – &
39 (octal 47, hex 27): caracter – ‘

4. Crearea datelor de iesire formatate

PHP include doua functii utile pentru generarea datelor de iesire formatate, în speta printf() si sprintf().
Functia printf() afiseaza datele sale de iesire, în timp ce functia sprintf() returneaza datele sale de iesire sub forma unei valori sir.
În general, fiecare functie preia doua sau mai multe argumente. Primul argument este un sir, denumit sir de formatate, care specifica formatul datelor de iesire, iar celelalte argumente specifica valorile care vor constitui datele de iesire.
Iata un exemplu simplu de utilizare a functiei sprintf():

<?php
$num = 8.7;
echo $num;
$num = sprintf(„%05.2f”, $num);
echo ‘<br>’. $num;
?>

– Rezultatul afisat va fi:

8.7
08.70

– Cu ajutorul expresiei „%05.2f”, sprintf() formateaza numarul din $num astfel incat acesta sa fie format din 5 caractere dintre care unul punct (.) si 2 zecimale.

Iata si doua exemple de utilizare a functiei printf():

<?php
$n = 8;
printf(„Valoarea lui n este: %d”, $n);
?>

– Va afisa „Valoarea lui n este: 8„.
Al doilea exemplu, putin mai complicat, prezinta modul de utilizare a functiei printf() cu mai multe argumente pentru datele de iesire:

<?php
$sir = ‘Aceasta este lectia %d din cursul %s’;
$num = 13;
$tip = ‘PHP’;
printf($sir, $num, $tip);
?>

– Includerea datelor formatate in sir se face in ordinea adaugarii variabilelor intre parantezele functiei „sprintf()”.
– Va afisa „Aceasta este lectia 13 din cursul PHP„.

Sirul de formatare consta dintr-o serie de caractere si directive ordinare. Un caracter ordinar este orice caracter, în afara caracterului „%”. Caracterele ordinare sunt pur si simplu copiate la iesire.
Directivele reprezinta secvente de caractere care încep cu simbolul „%„; aceste determina modul în care va fi formatat argumentul corespunzator.
O directiva simpla, cum este cea din exemplul precedent, poate consta dintr-un caracter „%” urmat de un specificator de tip, precum „d”, care arata ca argumentul trebuie tratat ca numar zecimal. Cu toate acestea, o directiva mai sofisticata poate include urmatoarele componente, care trebuie sa apara în ordinea indicata:

  • Specificator de completare (optional): – Un specificator de completare precizeaza caracterul care se va folosi pentru a completa rezultatul pâna la dimensiunea ceruta a sirului, în cazul în care caracterul de completare este omis, rezultatul este completat cu spatii. Specificatorul de completare poate fi un caracter spatiu sau un 0 (zero). Un specificator de completare de tip spatiu este folosit frecvent cu sirurile, iar un specificator de completare zero se foloseste mai ales alaturi de numere. Un alt caracter de completare poate fi specificat prin prefixarea acestuia cu un singur semn al citarii (‘). De exemplu, pentru a completa un rezultat cu liniute de subliniere, specificati ‘_ drept caracter de completare.
  • Specificator de aliniere (optional): – Un specificator de aliniere indica daca rezultatul trebuie sa fie aliniat la stânga sau la dreapta. Daca specificatorul de aliniere este omis, rezultatul va fi aliniat la dreapta; daca se indica o cratima (-) drept specificator de aliniere, rezultatul va fi aliniat la stânga.
  • Specificator de latime (optional): – Un specificator de latime este un întreg care determina numarul minim de caractere ale rezultatului; sau, daca argumentul este de tip double, numarul minim de caractere situate la stânga punctului zecimal. Daca rezultatul contine un numar mai redus de caractere, atunci va contine si caractere de completare.
  • Specificator de precizie (optional): – Un specificator de precizie este un punct zecimal, urmat de un întreg care determina numarul de cifre dupa punctul zecimal pe care trebuie sa le contina rezultatul. Specificatorul de precizie nu are nici un efect pentru alte tipuri decât double (float).
  • Specificator de tip (obligatoriu): – Specificatorul de tip determina modul de tratare si afisare a argumentului.


Tabelul urmator prezinta specificatorii de tip disponibili.

Specificatorii de tip PHP folositi la formatarea sirurilor
Specificator de tipDescriere
b– Trateaza argumentul ca pe un întreg si îl afiseaza ca valoare binara
c– Trateaza argumentul ca pe un întreg si afiseaza caracterul cu aceeasi valoare ASCII ca si argumentul
d– Trateaza argumentul ca pe un întreg si îl afiseaza ca valoare zecimala
f– Trateaza argumentul ca pe o valoare de tip double si îl afiseaza ca valoare cu virgula mobila
o– Trateaza argumentul ca pe un întreg si îl afiseaza ca pe o valoare scrisa în octal
s– Trateaza argumentul ca pe un sir si îl afiseaza
x– Trateaza argumentul ca pe un întreg si îl afiseaza ca numar hexazecimal, cu litere scrise cu minuscule
X– Trateaza argumentul ca pe un întreg si îl afiseaza ca numar hexazecimal, cu litere scrise cu majuscule

Daca doriti sa inserati simbolul procentului în datele de iesire ale unui apel la functia printf() sau sprintf(), inserati doua caractere „%”.
Tabelul urmator prezinta rezultatele aplicarii a diferite siruri de formatare valorilor selectate. Studiati tabelul si verificati daca ati înteles corect modul de operare a specificatorilor din cadrul fiecarui sir de formatare. Remarcati ca, în cazul omiterii cifrelor zecimale, se produce automat o rotunjire.
Spatiile au fost înlocuite prin accente circumflexe(^), pentru a facilita determinarea numarului de spatii si a amplasarii acestora.

Exemple de rezultate ale utilizarii a diferite siruri de formatare
ValoareFormatRezultat
100%d100
100%b1100100
100%o144
100%x64
100%f100.000000
12.345%^-10f12.345000^^^^^^^^
12.345%^10f^^^^^^^^12 .345000
12.345%^-10.2f12.35^^^^^^^^
12.345%10.2f^^^^^^^^12.35
test%^-10stest^^^^^^
test%^10s*^^^^^^test

Daca utilizarea functiilor printf() si sprintf() pentru formatarea numerelor pare cam greoaie, puteti folosi functia number_format(), care returneaza o valoare de tip sir continând un rezultat formatat. Puteti apela functia cu unul, doua sau patru argumente:

  • number_format(numar)
  • number_format(numar, zecimale)
  • number_format(numar, zecimale, punct_zecimal, separator_mii)

– Argumentul „numar” specifica valoarea numerica pe care doriti sa o formatati.
– Argumentul „zecimale” specifica numarul dorit de cifre zecimale.
– Argumentul „punct_zecimal” precizeaza caracterul ce se va folosi drept punct zecimal.
– Argumentul „separator_mii’ precizeaza caracterul care se va folosi ca separator al miilor.
În mod prestabilit, rezultatul este formatat fara zecimale, este inserat un punct (.) înaintea cifrelor care compun partea zecimala, respectiv se foloseste o virgula (,) pentru separarea miilor.
De exemplu, apelul la functia number_format(1.234, 2) returneaza valoarea 1.23

Functia PHP sscanf(), este complementara functiei printf(). Daca functia printf() genereaza date de iesire formatate, functia sscanf() citeste un sir, îl interpreteaza prin referirea la un sir de formatare si stabileste valorile variabilelor specificate în functie de continutul sirului.
Sa luam în considerare urmatorul exemplu:

<?php
$subiect = „08,25,2008”;
$n = sscanf($subiect, „%d,%d,%d”, &$luna, &$zi, &$an);
echo „Au fost gasite $n valori”;
echo „<br /> luna = $luna”;
echo „<br /> zi = $zi”;
echo „<br /> an = $an”;
?>

Datele de iesire ale acestui script sunt:

Au fost gasite 3 valori
luna = 8
zi = 25
an = 2008


– O lista cu mai multe functii utile in lucrul cu siruri gasiti la pagina -> Functii pentru siruri

Lucrul cu siruri (2)

  • Învatati sa maniupulati sirurile folosind diferite functii
  • Invatati sa lucrati cu subsiruri

1. Manipularea sirurilor

PHP contine peste 70 de functii care lucreaza cu siruri. Aceasta sectiune descrie cateva functii pe care este posibil sa le utilizati frecvent. Aceste functii va permit sa obtineti lungimea unui sir, sa eliminati dintr-un sir caracterele de tip spatiu alb, sa convertiti caracterele unui sir în majuscule sau minuscule si altele.
– Functia strlen() returneaza lungimea sirului specificat ca argument al functiei.
Iata un exemplu simplu de utilizare a functiei strlen():

<?php
$s = „Acesta este un sir”;
$n = strlen($s);
echo „<br /> Lungimea sirului este: $n”;
?>

Scriptul de mai sus va afisa:

Lungimea sirului este: 18

– Numeroase functii PHP va permit sa eliminati caracterele de tip spatiu alb de la una sau ambele extremitati ale unui sir.
Iata un exemplu; care prezinta modul de operare al acestor functii:

<?php
$s = ”         Acesta este un sir         „;
$n = strlen($s);
echo „<br /> Lungimea sirului este: $n”;

$trim =chop($s);       // Elimina spatiile albe din partea dreapta a sirului
$n = strlen($trim);
echo „<br /> Lungimea sirului este: $n”;

$trim = ltrim($s);       // Elimina spatiile albe din partea stanga a sirului
$n = strlen($trim);
echo „<br /> Lungimea sirului este: $n”;

$trim = rtrim($s);       // Elimina spatiile albe din partea dreapta a sirului
$n = strlen($trim);
echo „<br /> Lungimea sirului este: $n”;

$trim = trim($s);       // Elimina spatiile albe din ambele parti a sirului
$n = strlen($trim);
echo „<br /> Lungimea sirului este: $n”;
?>

Scriptul de mai sus va afisa:

Lungimea sirului este: 36
Lungimea sirului este: 27
Lungimea sirului este: 27
Lungimea sirului este: 27
Lungimea sirului este: 18


Urmatorul tabel prezinta Functiile PHP de eliminare a caracterelor din siruri:

Functii PHP de eliminare a caracterelor din siruri
FunctieDescriere
chop(s)– Returneaza valoarea lui ‘s’, eliminând spatiile albe de la extremitatea din dreapta a sirului. Similar cu rtrim()
ltrim(s)– Returneaza valoarea lui ‘s’, eliminând spatiile albe de la extremitatea din stânga a sirului
rtrim(s)– Returneaza valoarea lui ‘s’, eliminând spatiile albe de la extremitatea din dreapta a sirului. Similar cu chop()
trim(s)– Returneaza valoarea lui ‘s’, eliminând spatiile albe de la ambele extremitati

– Functia strtoupper() returneaza valoarea argumentului, convertita la majuscule.
– Functia strtolower{) returneaza valoarea argumentului, convertita la minuscule.
– Functia ucfirst{) returneaza valoarea argumentului, cu primul caracter din sir majuscula.
Nici una din functii nu modifica valoarea argumentului, valoarea convertita este cea returnata ca rezultat al functiei.
Iata un scurt exemplu, care prezinta modul de operare a acestor functii:

<?php
$s = „abcdefg”;
$rezultat = strtoupper($s);
$rezultat2 = ucfirst($s);
echo „<br />strtoupper(‘$s’): $rezultat”;
echo „<br />ucfirst(‘$s’): $rezultat2”;
$s = „ABCDE”;
$rezultat = strtolower($s);
echo „<br />strtolower(‘$s’): $rezultat”;
?>

Scriptul de mai sus va afisa:

strtoupper(abcdefg): ABCDEFG
ucfirst(abcdefg): Abcdefg
strtolower(ABCDE): abcde

2. Compararea sirurilor

PHP furnizeaza patru functii care sunt deosebit de utile pentru compararea sirurilor. Aceste functii sunt enumerate în tabelul urmator.
Fiecare functie returneaza o valoare al carei semn determina rezultatul comparatiei; nu trebuie sa încercati sa interpretati valoarea returnata efectiva.

Functii PHP de comparatie între siruri
FunctiaDescriere
strcasecmp(s1, s2)– Executa o comparatie fara sensibilitate la diferenta între majuscule si minuscule. Returneaza o valoare mai mica decât zero daca ‘s1’ este mai mic decât ‘s2’, o valoare mai mare decât zero daca ‘s1’ este mai mare decât ‘s2’, respectiv 0 în celelalte cazuri.
strcmp(s1, s2)– Executa o comparatie cu sensibilitate la diferenta între majuscule si minuscule. Returneaza o valoare mai mica decât zero daca ‘s1’ este mai mic decât ‘s2’, o valoare mai mare decât zero daca ‘s1’ este mai mare decât ‘s2’, respectiv 0 în celelalte cazuri.
strncasecmp(s1, s2, n)– Executa o comparatie fara sensibilitate la diferenta între majuscule si minuscule. La comparatie sunt luate în considerare un numar de ‘n’ caractere. Returneaza o valoare mai mica decât zero daca ‘s1’ este mai mic decât ‘s2’, o valoare mai mare decât zero daca ‘s1’ este mai mare decât ‘s2’, respectiv 0 în celelalte cazuri.
strncmp(s1,s2, n)– Executa o comparatie cu sensibilitate la diferenta între majuscule si minuscule. La com­paratie sunt luate în considerare un numar de ‘n’ caractere. Returneaza o valoare mai mica decât zero daca ‘s1’ este mai mic decât ‘s2’, o valoare mai mare decât zero daca ‘s1’ este mai mare decât ‘s2’, respectiv 0 în celelalte cazuri.

Iata un scurt exemplu care prezinta modul de utilizare a acestor functii:

<?php
$s1 = „abcd”;
$s2 = „ABCE”;
$rezultat = strcasecmp($s1, $s2);
echo „<br /> Functia strcasecmp a returnat $rezultat”;
$rezultat = strcmp($s1, $s2);
echo „<br /> Functia strcmp a returnat $rezultat”;
$rezultat = strncasecmp($s1, $s2, 3);
echo „<br /> Functia strncasecmp returnat $rezultat”;
$rezultat = strncmp($s1, $s2, 3);
echo „<br /> Functia strncmp a returnat $rezultat”;
?>

Scriptul de mai sus va afisa:

Functia strcasecmp a returnat -1
Functia strcmp a returnat 1
Functia strncasecmp returnat 0
Functia strncmp a returnat 1

Datele de iesire va arata ca functia strcasecmp() a identificat sirul „abcd” ca fiind mai mic decât „ABCE”, in schimb, functia strcmp(), la fel ca si functia strncmp(), a identificat sirul „abcd” ca fiind mai mare decât „ABCE”. Aceasta s-a întâmplat deoarece literele minuscule au în secventa ASCII o pozitie superioara literelor scrise cu majuscule; litera ‘A’ are valoarea ASCII 65, iar litera ‘a’ are valoarea ASCII 97.
De asemenea, datele de iesire arata ca functia strncasecmp() a identificat sirul „s1” ca egal cu „s2”, deoarece au fost luate in considerare numai primele 3 caractere.

3. Descoperirea si extragerea sub-sirurilor

PHP include numeroase functii care gasesc si extrag sub-tiruri, adica parti dintr-un sir. Cele mai importante functii de acest gen sunt rezumate în tabelul urmator:

Functii PHP de extragere si cautare
FunctieDescriere
strchr(s1,s2)– Returneaza toate sirurile ‘s1’ de la prima aparitie a sirului ‘s2’ si pâna la sfârsit. Daca ‘s1’ nu este gasit, functia returneaza FALSE. Functia strstr() executa aceeasi operatie
stristr(s1,s2)– Returneaza toate sirurile ‘s1’ de la prima aparitie a sirului ‘s2’ si pâna la sfârsit. Daca ‘s1’ nu este gasit, functia returneaza FALSE. Sirurile ‘s1’ si ‘s2’ sunt comparate fara a se tine cont daca literele sunt majuscule sau minuscule
strpos(s1,s2)– Returneaza pozitia (nr. intreg) a primei aparitii a sirului ‘s2’ în ‘s1’.Daca ‘s2’ nu este gasit, functia returneaza FALSE
strrchr(s1,s2)– Returneaza toate sirurile ‘s1’ de la ultima aparitie a sirului ‘s2’ si pâna la sfârsit. Daca ‘s1’ nu este gasit, functia returneaza FALSE. La comparatie este folosit numai primul caracter al sirului ‘s2’
strstr(s1,s2)– Returneaza toate sirurile ‘s1’ de la prima aparitie a sirului ‘s2’ si pâna la sfârsit. Daca ‘s1’ nu este gasit, functia returneaza FALSE. Functia strchr() executa aceeasi operatie
substr(s, starf)
substr(s, start, lung)
– Returneaza portiunea sirului ‘s’ specificata de indexul întreg ‘start’ respectiv de indexurile ‘start’ si ‘lung’. Prima pozitie a sirului este pozitia 0.

Iata un exemplu simplu, care prezinta modalitatile de utilizare a mai multor functii de extragere si cautare:

<?php
$s = „the cat on the mat near the bat”;
$b = „at”;
$n = strpos($s, $b);
echo „<br /> strpos(\”$s\”, \”$b\”): $n”;

$s = „the cat on the mat near the bat”;
$b = „at”;
$n = strchr($s, $b);
echo „<br /> strchr(\”$s\”, \”$b\”): $n”;

$s = „the cat on the mat near the bat”;
$b = „at”;
$n = strrchr($s, $b);
echo „<br /> strrchr(\”$s\”, \”$b\”): $n”;

$s = „the cat on the mat near the bat”;
$rezultat = substr($s, 4, 3);
echo „<br /> substr(\”$s\”, 4, 3): $rezultat”;
?>

Studiati cu atentie scriptul si tabelul de mai sus pentru a intelege datele de iesire. Iata si datele de iesire:

strpos(„the cat on the mat near the bat”, „at”): 5
strchr(„the cat on the mat near the bat”, „at”): at on the mat near the bat
strrchr(„the cat on the mat near the bat”, „at”): at
substr(„the cat on the mat near the bat”, 4, 3): cat

O potentiala dificultate în utilizarea functiei strpos() consta în aceea ca poate fi greu de sesizat diferenta dintre valoarea returnata 0, care arata ca sub-sirul a fost gasit în pozitia initiala a sirului, si valoarea returnata FALSE, care arata ca sub-sirul nu a fost gasit.
Iata un scurt exemplu care indica un mod adecvat de testare a valorii returnate de functia strpos(), astfel încât sa se poata face diferenta între cele doua rezultate:

<?php
$poz = strpos($s1, $s2);
if ($poz == FALSE) {
      echo „<br /> sub-sirul nu a fost gasit”;
}
?>

Procedeul prezentat foloseste operatorul de identitate (==) pentru a determina daca valoarea returnata este identica – nu doar aritmetic egala – cu valoarea FALSE.

4. Înlocuirea unui sub-sir

O operatie frecvent folosita în programare consta în gasirea unui sub-sir si înlocuirea sa cu o valoare noua. PHP are doua functii deosebit de utile pentru asemenea operatii, si anume str_replace() si substr_replace().
Mai jos sunt prezentate pe scurt aceste functii.
Remarcati ca functia str_replace() noteaza sub-sirul prin valoarea sa, în timp ce functia substr_replace() noteaza sub-sirul prin pozitia sa în interiorul sirului subiect.

  • str_replace(cauta, înlocuire, subiect) – Se cauta în sirul ‘subiect’ sub-sirul ‘cauta’; daca sub-sirul este gasit, returneaza valoarea ‘subiect’, înlocuindu-se prima aparitie a sirului ‘cauta’ cu ‘înlocuire’.
  • substr_replace(subiect, înlocuire, start, lungime) – Returneaza valoarea ‘subiect’, înlocuind sub-siruf care începe de la ‘start’ si având lungimea ‘lungime’ cu sirul ‘înlocuire’.

Iata un exemplu care prezinta modul de utilizare a acestor functii:

<?php
$subiect = „the cat on the mat near the bat”;
echo „<br /> Subiect : $subiect”;

$cauta = „cat”;
$inlocuire = „DOG”;
$rezultat = str_replace($cauta, $inlocuire, $subiect);
echo „<br /> str_replace : $rezultat”;

$inlocuire = „CAT”;
$rezultat = substr_replace($subiect, $inlocuire, 4, 3);
echo „<br /> substr_replace : $rezultat”;
?>

Iata si rezultatul exemplului :

Subiect : the cat on the mat near the bat
str_replace : the DOG on the mat near the bat
substr_replace : the CAT on the mat near the bat


– O lista cu mai multe functii utile in lucrul cu siruri gasiti la pagina -> Functii pentru siruri

Expresii regulate, regex

  • Invatati sa scrieti si sa utilizati expresii regulate
  • Invatati sa verificati sirurile in functie de expresii regulate

1. Scrierea expresiilor regulate (Regex)

Expresiile regulate (regex) sunt un sir de caractere sablon care descriu multimea cuvintelor posibile care pot fi formate cu acele caractere, respectand anumite reguli. Aceste expresii regulate folosesc paranteze (rotunde, patrate, acolade) prin care formeaza regulile de formare a cuvintelor. Utilitatea cea mai frecventa a unei expresii regulate consta în a recunoaste daca un sir contine sau nu cuvinte sau sub-sir care pot fi formate prin expresia regulata respectiva.

  • De ex.: expresia m[ai]r poate forma cuvintele: mar si mir

Sa presupunem ca doriti sa specificati un sir care poate include orice vocala. Puteti face aceasta folosind expresia regulata [aeiou]. Prin includerea valorilor posibile între paranteze, formati o expresie regulata echivalenta cu formularea „alege oricare din aceste valori”. Daca doriti sa permiteti si utilizarea, majusculelor, puteti scrie [aeiouAEIOU].
Sa presupunem ca doriti sa specificati un sir care poate include orice caracter scris cu minuscule. Puteti scrie: [abcdefghijklmnopqrstuvwxyz]. Sau puteti folosi o forma mai compacta [a-z], unde prin cratima se întelege „o serie de caractere consecutive”.
Sa presupunem ca doriti sa specificati intr-o expresie regulata sirurile „sat”, „mat” si „lat”. Pentru aceasta, aveti nevoie de expresia regulata [sml]at. Semnificatia acestei expresii regulate este urmatoarea: „alege oricare din literele ‘s’, ‘m’ si ‘l’ si scrie dupa litera respectiva literele ‘at’„.
Daca un accent circumflex (^) este primul simbol mentionat între parantezele drepte, acesta are ca efect inversarea semnificatiei expresiei regulate plasate între paranteze.

  • De exemplu, expresia regulata [^a-z] corespunde oricarui caracter care nu este o litera mica.

Pentru a specifica faptul ca o expresie regulata se poate repeta, expresia regulat va fi urmata de o pereche de acolade, care includ limitele superioara si inferioara ale repetitiei.

  • De exemplu, expresia regulata [aeiou]{1,4} corespunde sirurilor care pot contine intre 1 si 4 vocale.

Pentru a specifica repetarea mai multor parti ale unei expresii regulate, includeti partile respective între paranteze rotunde.

  • De exemplu, expresia regulata ([sml]at){1 ,2} corespunde unui numar de una sau doua repetari ale oricaruia dintre sirurile „sat”, „mat” sau „lat”.

Pentru a simplifica scrierea de reguli intr-o expresie regulata se folosesc anumite caractere „speciale”
Sa presupunem ca doriti sa reprezentati o înmultire intre doua numere, puteti obtine ceva de genul [0-9]*[0-9]. Totusi, aceasta expresie regulata nu are semnificatia dorita, deoarece ‘*’ este un factor de repetitie, nu un caracter dintr-un sir. Pentru a dezactiva semnificatia speciala a caracterului ‘*’, trebuie sa-l prefixati cu un caracter backslash: [0-9]\*[0-9].
Pentru a specifica faptul ca o expresie regulata corespunde numai unui sub-sir care include anumite caractere la inceput, prefixati expresia regulata cu un accent circumflex „^”. De exemplu, expresia regulata ^[sml]at corespunde sub-sirurilor „sat”, „mat” sau „lat” numai daca acestea apar la începutul sirului subiect.
Similar, pentru a arata ca o expresie regulata corespunde numai unui sub-sir care include anumite caractere la sfarsit, anexati la expresia regulata un simbol al dolarului „$”. De exemplu, expresia regulata [sml]at$ corespunde sirurilor „sat”, „mat” sau „lat” numai daca acestea apar la sfârsitul sirului subiect.
Iata o lista cu mai multe caractere speciale si rolul lor in expresiile regulate:

  • ^   – indica inceputul liniei
  • $   – indica sfarsitul liniei
  • .   – (punct) orice caracter
  • []   – un caracter dintre cele din paranezele patrate
  • [^]   – orice caracter, in afara celor din paranezele patrate
  • \   – scoate din contextul formari expresiei caracterul care urmeaza
  • +   – caracterul (expresia) anterior acestui semn se poate repeta odata si de cate ori e posibil (de la 1 la infinit)
  • *   – caracterul (expresia) anterior acestui semn se poate repeta de cate ori e posibil sau niciodate (de la 0 la infinit)
  • ?   – caracterul (expresia) anterior acestui semn se poate repeta ce mult odata
  • <>   – un cuvant intreg
  • (|)   – lista de optiuni SAU
  • {m, n}   – repetarea expresiei de la „m” la „n” ori


Iata cateva exemple de expresii regulate:

  • (.*)   – Reprezinta toate caracterele (prin .) repetate de cate ori e posibil (dat de *)
  • <salut>   – Cuvantul „salut”
  • (ci|co)tim   – Reprezinta „citim” si „cotim”
  • ^The .* hack$   – Sirurile care incep cu „the ” si se sfarsesc cu ” hack”
  • ^www.[a-z0-9]+.ro$   – Reprezinta sirurile „www.–.ro” unde ‘–‘ poate fi orice litera sau cuvant ce contine litere mici si numere
  • (^-\+[0-9]*)   – Orice numar care incepe cu „-” sau „+”
  • ^([a-zA-Z0-9]+[a-zA-Z0-9._%-]*@([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,4})$   – Expresie regulata pentru adrese de e-mail

2. Utilizarea expresiilor regulate

PHP include numeroase functii care lucreaza cu expresii regulate. Tabelul urmator descrie unele din aceste functii.

Functii PHP pentru expresii regulate
FunctieDescriere
ereg– Executa o identificare cu o expresie regulata (anulata incepand cu versiunea PHP 5.3)
ereg_replace– Înlocuieste un sub-sir care corespunde unei expresii regulate (anulata incepand cu versiunea PHP 5.3 – in locul ei poate fi folosita preg_replace)
eregi– Executa o identificare cu o expresie regulata insensibila la diferenta între majuscule si minuscule (anulata incepand cu versiunea PHP 5.3)
eregi_replace– Înlocuieste un sub-sir care corespunde unei expresii regulate insensibile la diferenta între majuscule si minuscule (anulata incepand cu versiunea PHP 5.3 – in locul ei poate fi folosita preg_replace)
preg_replace– Cauta in sir caracterele sau sablonul care se potriveste cu expresia regulata din functie si o inlocuieste cu alte valori date
split– Divide un sir într-un tablou folosind o expresie regulata (anulata incepand cu versiunea PHP 5.3 – in locul ei poate fi folosita preg_split)
sql_regcase– Creaza o expresie regulata, insensibila la diferenta între majuscule si minuscule, dintr-un sir care contine o expresie regulata (anulata incepand cu versiunea PHP 5.3)

In continuare este dat un exemplu cu functia ereg().
Forma simpla a functiei ereg() preia doua argumente: un sir care contine o expresie regulata si un sir subiect. Functia returneaza TRUE daca expresia regulata corespunde unui sub-sir al sirului subiect; în caz contrar, returneaza FALSE.

– Iata un exemplu:

<?php
$model = „[sml]at”;
$subiect = „La noi in sat”;
$rezultat = ereg($model, $subiect);
if ($rezultat) {
    echo ‘Model inclus in subiect’;
}
?>

– In acest script, variabila $rezultat primeste valoarea TRUE, deoarece sirul ‘subiect’ contine sub-sirul „sat”, care corespunde expresiei regulate.
Pentru verificare, instructiunea „if” verifica daca „$resultat” este TRUE si in caz afirmativ executa comanda dintre acolade, „echo” care afiseaza ‘Model inclus in subiect‘.

– Pentru a verifica daca un sir contine numai litere si numere, puteti folosi direct functia ctype_alnum()

– Deoarece functiile „ereg” au fost anulate incepand cu versiunea PHP 5.3, este indicat sa nu le mai folositi, cunoasterea lor e necesara daca le intalniti in scripturi mai vechi. Acestea au fost inlocuite cu functii „preg_” (Perl-Compatible). Mai multe detalii si exemple despre aceste functii gasiti in manualul Expresii regulate (compatibile Perl.
Expresiile regulate compatigile Perl se adauga intre caractere „/”. De exemplu sablonul ([a-z0-9]+) se foloseste /([a-z0-9]+)/.

Iata un exemplu cu preg_grep(), aceasta returneaza un array compus din elementele unei matrice care contin sablonul, expresia regulata cautata. Acest exemplu va returna doar acele elementele dintr-o matrice care contin in ele sub-sirurile „casa” sau „masa”.

<?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” contine un Array cu mai multe elemente cu siruri.
– In variabila $filtru e preluat rezultatul functiei „preg_grep()” a carei prim parametru este un sablon de expresie regulata (adaugata intre ghilimele duble), iar al doilea este matricea in care e cautat sablonul.
– Cu functia „print_r()” se va afisa elementele matricei obtinute in variabila „$filtru”. Rezultatul afisat e urmatorul:

Array ( [0]=>123casa [1]=>abc masa [4]=>123abc casa )


– Un ultim exemplu util, folosim functia preg_replace() si o expresie regulata pentru a elimina caracterelor speciale dintr-un sir

<?php
$sir = ‘Sir& ce contine*a <caractere: speciale? /in co@nte>xt’;
$sir = preg_replace(„/([^ A-Za-z0-9_]+)/”, „”, $sir);
echo $sir;
?>

In acest exemplu avem un sir (stocat in variabila $sir) ce contine diferite caractere mai putin uzuale.
Functia „preg_replace”, impreuna cu expresia regulata „/(^ A-Za-z0-9_]+)/”, pastreaza in $sir numai literele, cifrele, caracterul ‘_’ si spatiu.
Instructiunea „echo” va afisa urmatorul rezultat:

Sir ce continea caractere speciale in context

Similar Posts

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *