<titlu>Utilizarea sirurilor</titlu> u4c18cl
<titlu>Scopuri</titlu>
• Invatati sa utilizati secvente escape suplimentare pentru a include
in siruri caracterele speciale
• invatati sa folositi siruri incadrate intre ghilimele
simple
• invatati sa utilizati codurile ASCII
• invatati sa creati date de iesire formatate
• invatati sa folositi o varietate de functii sir PHP, care va permit
sa cautati si sa manipulati siruri
In Modulul 2 au fost prezentate sirurile, tipul de date PHP care stocheaza
texte, in cadrul modulului de fata, veti invata mai multe despre
utilizarea sirurilor.
<tilu>Crearea si afisarea sirurilor</titlu>
Pana acum, ati invatat numeroase aspecte despre siruri. Sa recapitulam
notiunile elementare inainte de a aborda" subiecte mai complexe:
• Valorile literale de tip sir sunt secvente de caractere incluse intre
ghilimele duble.
• Puteti include un caracter special in 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 prin intermediul operatorului de atribuire.
• Operatorul de concatenare ( . ) se poate folosi pentru unirea sirurilor.
• PHP poate converti in mod automat o valoare numerica intr-un
sir, respectiv valoarea unui sir intr-un numar.
Daca vreunul din aceste aspecte fundamentale vi se pare necunoscut, parcurgeti
materialul corespunzator din capitolele 2 sau 5 inainte de a continua.
<titlu>Secvente escape suplimentare</titlu>
Modulul 2 a prezentat numeroase secvente escape pe care le puteti folosi pentru
a include caractere speciale in cadrul sirurilor. Cu toate acestea, PHP
include doua secvente escape care nu au fost descrise in Modulul 2. Tabelul
9-1 prezinta setul complet de secvente escape folosite in PHP.
<tabel 9-1 Secventele escape folosite in PHP>
*Secventa escape
*Semnificatie
*\n
*salt la linie noua
*r
*retur de car
*\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
in hexazecimal
</tabel 9-1>
Ultimele doua secvente escape prezentate in tabelul 9-1 nu au fost descrise
in Modulul 2. Fiecare dintre aceste secvente escape foloseste un cod ASCII
(America Standard Code for Information Interchange) pentru reprezentarea unui
caracter. Codurile ASCII sunt valori intregi, care sunt cuprinse intre
0 si 255; fiecare litera sau simbol folosit frecvent in 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 va permite sa folositi reprezentarea in
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 repre¬zentata in octal sub forma 101. Ca atare, puteti reprezenta
litera A folosind secventl escape "\101".
Cea de-a doua secventa escape necunoscuta va permite sa folositi reprezentarea
hexazecimala (in 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".
Daca aveti nevoie de o reactualizare a cunostintelor dumneavoastra in
materie de lucrul cu baze de numeratie diferite, sa ne reamintim ca valoarea
unui numar zecimal este suma produselor dintre fiecare cifra care il 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 = 1x100 + 2x10 + 3x1.
Puteti determina valoarea unui numar reprezentat folosind o alta baza prin inlocuirea
lui 10 cu valoarea bazei respective intr-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 in octal 123 este echivalenta
cu valoarea zecimala 1x8 la puterea 2 + 2x8 la puterea 1 + 3x8 la puterea 0=1x64
+ 2x8 + 3xl=83. Daca algebra nu a fost materia dumneavoastra preferata, nu intrati
in panica; in subsectiunea urmatoare veti invata sa determinati
valoarea in octal sau hexazecimal echivalenta cu orice valoare zecimala.
<titlu>Utilizarea codurilor ASCII</titlu>
Numeroase functii PHP sunt deosebit de folositoare la utilizarea codurilor ASCII.
Aceste functii sunt enumerate in tabelul 9-2.
Iata un scurt exemplu de utilizare a functiei ord() pentru a determina codul
ASCII corespunzator unui anumit caracter:
$c = „A”;
$n ord($c); echo „<BR>Valoarea ASCII a caracterului $c este $n;
Datele de iesire ale exemplului respectiv sunt urmatoarele:
Valoarea ASCII a caracterului A este 65
Iata un exemplu care afiseaza echivalentele in zecimal, octal, respectiv
hexazecimal al caracterelor ASCII ale caror coduri sunt cuprinse intre
32 si 127:
for ($i=32; $i<128; $i++)
A
$c=chr($i);
$octal = decoct($i)
$hex = dechex($i); echo „<BR>$i (octal $octal, hex $hex): $c”;
S
Domeniul dat include caracterele ASCII care se pot afisa. Iata o selectie din
datele de iesire ale exemplului:
32 (octal 40, hex 20):
33 (octal 41, hex 21):!
34 (octal 42, hex 22):”
35 (octal 43, hex 23):#
36 (octal 44, hex 24):$
Remarcati corespondenta codului ASCII 32 cu un caracter spatiu.
<tabel 9-2 Functii folositoare in utilizarea codurilor ASCII>
*Functie
*Descriere
*chr(/n)
* Returneaza caracterul avand codul ASCII dat de n.
*dechex(n)
*Returneaza valoarea hexazecimala echivalenta cu valoarea zecimala data de n.
*decoct(n)
*Returneaza valoarea in 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 in octal data de
n.
*ord(c)
*Returneaza codul ASCII echivalent caracterului c.
</tabel 9-2>
<titlu>Siruri delimitate intre ghilimele simple</titlu>
Daca preferati, puteti delimita un sir intre ghilimele simple, nu neaparat
duble. Un motiv in acest sens il constituie facilitarea posibilitatii
de includere a ghilimelelor
duble in sir; daca delimitati un sir intre ghilimele duble, toate
ghilimelele duble din cadrul sirului trebuie corelate cu un caracter backslash:
„\”Stop\”, striga el, \ “sau trag!\””
Acesta este un sir care contine nume¬roase ghilimele duble. - N.T.
Acest sir poate fi scris intr-un mod mai convenabil astfel:
’ ”Stop”, striga el, „sau trag!” ’
Sirurile delimitate intre ghilimele simple se comporta intr-un
mod diferit fata de sirurile delimitate prin ghilimele duble:
• Singurele secvente escape permise in cadrul sirurilor delimitate
prin ghilimele simple sunt \ \ si \'.
• Nu se executa substitutia variabilelor atunci cand datele de iesire
sunt reprezentate printr-un sir delimitat prin ghilimele simple.
In consecinta, datele de iesire ale urmatorului exemplu
$x = „text”; echo ’x este $x.’;
sunt urmatoarele:
x este $x.
si nu
x este text.
<titlu>Crearea datelor de iesire formatate</titlu>
PHP include doua functii utile pentru generarea datelor de iesire formatate,
in speta printf () si sprintf (). Functia printf () afiseaza datele sale
de iesire, in timp ce functia sprintf () returneaza datele sale de iesire
sub forma unei valori sir. In 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 printf ():
Printf(„Valoarea lui n este: %d”,$n);
Iata si un exemplu mai complicat, care prezinta modul de utilizare a functiei
sprintf () cu mai multe argumente pentru datele de iesire:
$rezultat = sprintf(„Valori: %d, %f, $n, $x);
Sirul de formatare consta dintr-o serie de caractere si directive ordinare.
Un caracter ordinar este orice caracter, in afara caracterului %. Caracterele
ordinare sunt pur si simplu copiate la iesire.
Directivele reprezinta secvente de caractere care incep cu simbolul %;
aceste determina modul in 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 urma¬toarele componente, care trebuie sa apara in ordinea
indicata:
• Specificator de completare (optional): Un specificator de completare
precizeaza caracterul care se va folosi pentru a completa rezultatul pana
la dimensiunea ceruta a sirului, in cazul in 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 stanga 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 stanga.
• Specificator de latime (optional): Un specificator de latime este un
intreg care determina numarul minim de caractere ale rezultatului; sau,
daca argumentul este de tip double, numarul minim de caractere situate la stanga
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 intreg 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 decat double.
• Specificator de tip (obligatoriu): Specificatorul de tip determina modul
de tratare si afisare a argumentului. Tabelul 9-3 rezuma specificatorii de tip
disponibili.
<tabel 9-3 Specificatorii de tip PHP folositi la formatarea sirurilor>
*Specificator de tip
*Descriere
*b
*Trateaza argumentul ca pe un intreg si il afiseaza ca valoare binara.
*c
*Trateaza argumentul ca pe un intreg si afiseaza caracterul cu aceeasi
valoare ASCII ca si argumentul.
*d
*Trateaza argumentul ca pe un intreg si il afiseaza ca valoare zecimala.
*f
*Trateaza argumentul ca pe o valoare de tip double si il afiseaza ca valoare
cu virgula mobila.
*o
*Trateaza argumentul ca pe un intreg si il afiseaza ca pe o valoare
scrisa in octal.
*s
*Trateaza argumentul ca pe un sir si il afiseaza.
*x
*Trateaza argumentul ca pe un intreg si il afiseaza ca numar hexazecimal,
cu litere scrise cu minuscule.
*X
*Trateaza argumentul ca pe un intreg si il afiseaza ca numar hexazecimal,
cu litere scrise cu majuscule.
</tabel 9-3>
Daca doriti sa inserati simbolul procentului in datele de iesire ale
unui apel la functia printf () sau sprintf (), inserati doua caractere % in
locul dorit. La aparitia a doua caractere %, functiile printf () si sprintf
() stiu ca doriti sa inserati un simbol al procentului, nu o directiva de formatare.
Tabelul 9-4 prezinta rezultatele aplicarii a diferite siruri de formatare valorilor
selectate. Studiati tabelul si verificati daca ati inteles corect modul
de operare a specificatorilor din cadrul fiecarui sir de formatare. Remarcati
ca, in cazul omiterii cifrelor zecimale, se produce automat o rotunjire.
< remarca >
In tabelul 9-4, spatiile au fost inlocuite prin accente circumflexe,
pentru a facilita deter¬minarea numarului de spatii si a amplasarii acestora.</remarca>
<tabel 9-4 Exemple de rezultate ale utilizarii a diferite siruri de formatare
>
*Valoare
*Format
*Rezultat
*100
*„%d"
* 100
*100
*„%b"
*1100100
*100
*„%o"
*144
* 100
*„%x"
*64
*100
*„%f"
*100.000000
*12.345
*„%'^-10f"
*12.345000^^^^^^^^
*12.345
*„%'^10f"
*^^^^^^^^12 .345000
*12.345
*„%'^-10.2f"
*12.35^^^^^^^^
*12.345
*„%'10.2f"
*^^^^^^^^12.35
*„test"
*„%'^-10s"
*test^^^^^^
*„test"
*„%'^10s"
*^^^^^^test
</tabel 9-4>
<Sfatul specialistului>
Intrebare:Utilizarea functiilor printf () si sprintf () pentru formatarea
numerelor pare cam greoaie. Nu exista si alte metode?
Raspuns: Daca preferati, puteti folosi functia number_format(), care returneaza
o valoare de tip sir continand 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, iar argu¬mentul
separator_mii precizeaza caracterul care se va folosi ca separator al miilor.
In mod prestabilit, rezultatul este formatat fara zecimale, este inserat
un punct (.) inaintea 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 </Sfatul specialistului>
<Test „la minut">
• Scrieti secventa escape care reprezinta caracterul a carui valoare ASCII
este data de valoarea in octal 17.
• Scrieti secventa escape care reprezinta caracterul a carui valoare ASCII
este data de valoarea hexazecimala l f.
• Denumiti functia care returneaza valoarea hexazecimala a unui numar
zecimal.
• Scrieti un sir de formatare care genereaza un numar cu virgula mobila
cu doua cifre zecimale.
</Test „la minut”>
<nota>
Raspunsuri la test:
• "\017"
• "\x1f"
• dechex()
• „%.2f”
</nota>
<titlu>Manipularea sirurilor</titlu>
PHP contine peste 70 de functii care lucreaza cu siruri. Aceasta sectiune descrie
numeroase 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 si sa convertiti caracterele unui sir in majuscule sau
minuscule.
<titlu>Obtinerea lungimii unui sir</titlu>
Functia strlen() returneaza lungimea sirului specificat ca argument al functiei.
Iata un exemplu simplu de utilizare a functiei strlen():
$s = „Acesta este un sir.”;
$n = strlen($s); echo „<BR>Lungimea sirului este: $n”;
Acesta este rezultatul generat de exemplul de mai sus:
Lungimea sirului este: 19
<titlu>Eliminarea caracterelor dintr-un sir</titlu>
Numeroase functii PHP va permit sa eliminati caracterele de tip spatiu alb de
la una sau ambele extremitati ale unui sir. Caracterele de tip spatiu alb sunt
caractere precum spatiu, tabulator si caracter de salt la linie noua, care nu
dispun de nici o reprezentare vizibila. Aceste functii sunt prezentate in
tabelul 9-5. Iata un exemplu; care prezinta modul de operare al acestor functii.
$s = „ Acesta este un sir „;
$n = strlen($s); echo „<BR>Lungimea sirului este: $n”;
$trim =chop($s);
$n = strlen($trim); echo „<BR>Lungimea sirului este: $n”;
$trim = ltrim($s);
$n = strlen($trim); echo „<BR>Lungimea sirului este: $n”;
$trim = rtrim($s);
$n = strlen($trim); echo „<BR>Lungimea sirului este: $n”;
$trim = trim($s);
$n = strlen($trim); echo „<BR>Lungimea sirului este: $n”;
Iata si datele de iesire ale exemplului:
Lungimea sirului este: 39
Lungimea sirului este: 29
Lungimea sirului este: 29
Lungimea sirului este: 29
Lungimea sirului este: 19
<tabel 9-5 Functii PHP de eliminare a caracterelor din siruri>
*Functie
*Descriere
*chop(s)
*Returneaza valoarea lui s, eliminand spatiile albe de la extremitatea
din dreapta a sirului. Similar cu rtrim().
*ltrim(s)
*Returneaza valoarea lui s, eliminand spatiile albe de la extremitatea
din stanga a sirului.
*rtrim(s)
*Returneaza valoarea lui s, eliminand spatiile albe de la extremitatea
din dreapta a sirului. Similar cu chop().
*trim(s)
*Returneaza valoarea lui s, eliminand spatiile albe de la ambele extremitati.
<titlu>Conversia sirurilor la majuscule sau minuscule</titlu>
Functia strtoupper() returneaza valoarea argumentului sau, convertita la majuscule.
Functia conexa strtolowerA) returneaza valoarea argumentului sau, convertita
la minuscule. Nici una din functii nu modifica valoarea argumentului sau; valoarea
convertita este cea returnata ca rezultat al functiei. Iata un scurt exemplu,
care prezinta modul de operare a acestor functii:
$s = „abcd”;
$rezultat = strtoupper($s); echo „<BR>strtoupper($s): $rezultat”;
$s = „ABCD”;
$rezultat = strtolower($s); echo „<BR>strtolower($s): $rezultat”;
Iata si datele de iesire generate de exemplul respectiv:
Strtoupper(abcd): ABCD
Strtolower(ABCD): abcd
<Test „la minut">
• Care este functia ce returneaza lungimea unui sir?
• Care este functia care elimina caracterele de tip spatiu alb de la ambele
extremitati ale unui sir?
• Care este functia care converteste caracterele unui sir in minuscule?
</Test „la minut">
<nota>
Raspunsuri la test:
• strlen()
• trim()
• strtolower()</nota>
<Sfatul specialistului>
Intrebare: Ati spus ca PHP include peste 70 de functii care utilizeaza
siruri, dar ati descris numai cateva. Cum pot afla detalii si despre celelalte
functii?
Raspuns: Sectiunea urmatoare descrie unele functii PHP sir care compara siruri
si executa cautari in siruri. Cu toate acestea, PHP include mult mai multe
functii sir decat cele care pot fi descrise in acest capitol. Pentru
a afla mai multe detalii despre functiile sir suplimentare, consultati manualul
PHP pe suport electronic, la adresa https://www.php.net. </Sfatul specialistului>
<titlu>Compararea sirurilor si cautarea in siruri</titlu>
In sectiunea anterioara ati invatat despre numeroase functii PHP
care manipuleaza siruri, in aceasta sectiune, veti afla detalii despre
numeroase functii PHP care executa anumite categorii de operatii cu siruri,
si anume compararea si cautarea.
<titlu>Compararea sirurilor</titlu>
• PHP furnizeaza patru functii care sunt deosebit de utile pentru compararea
sirurilor. Aceste functii sunt enumerate in tabelul 9-6. Fiecare functie
returneaza o valoare al carei semn determina rezultatul comparatiei; nu trebuie
sa incercati sa interpretati valoarea returnata efectiva. Functia strncasecmp()
a fost adaugata in versiunea PHP 4.0.2; daca dispuneti de o versiune anterioara
a limbajului PHP, nu aveti la dispozitie aceasta functie.
<tabel 9-6 Functii PHP de comparatie intre siruri>
*Functia
*Descriere
*strcasecmp(s1, s2)
*Executa o comparatie fara sensibilitate la diferenta intre majuscule
si minuscule. Returneaza o valoare mai mica decat zero daca s1 este mai
mic decat s2, o valoare mai mare decat zero daca s1 este mai mare
decat s2, respectiv 0 in celelalte cazuri.
*strcmp(s1, s2)
*Executa o comparatie cu sensibilitate la diferenta intre majuscule si
minuscule. Returneaza o valoare mai mica decat zero daca s1 este mai mic
decat s2, o valoare mai mare decat zero daca s1 este mai mare decat
s2, respectiv 0 in celelalte cazuri.
*strncasecmp(s1, s2, n)
*Executa o comparatie fara sensibilitate la diferenta intre majuscule
si minuscule. Returneaza o valoare mai mica decat zero daca s1 este mai
mic decat s2, o valoare mai mare decat zero daca s1 este mai mare
decat s2, respectiv 0 in celelalte cazuri. La comparatie sunt luate
in considerare un numar de n caractere.
*strncmp(s1,s2, n)
*Executa o comparatie cu sensibilitate la diferenta intre majuscule si
minuscule.Returneaza o valoare mai mica decat zero daca s1
este mai mic decat s2, o valoare mai mare decat zero daca s1 este
mai mare decat s2, respectiv 0 in celelalte cazuri. La com¬paratie
sunt luate in considerare un numar de n caractere.</tabel 9-6>
Iata un scurt exemplu care prezinta modul de utilizare a acestor functii, precum
si datele de iesire ale exemplului:
$s1 = „abcd”;
$s2 = „ABCD”;
$rezultat = strcasecmp($s1, $s2); echo „ <BR>Functia strcasecmp a returnat $rezultat.”;
$rezultat = strcmp($s1, $s2); echo „ <BR>Functia strcmp a returnat $rezultat.”;
//PHP 4.0.2+
$rezultat = strncasecmp($s1, $s2); echo „ <BR>Functia strncasecmp returnat $rezultat.”;
$rezultat = strncmp($s1, $s2, 3); echo „ <BR>Functia strncmp a returnat $rezultat.”;
Iata si datele de iesire ale exemplului:
Functia strcmp a returnat 1.
Functia strcnmp a returnat 1.
Functia strcasecmp a returnat -1.
Functia strncasecmp a returnat 0.
Datele de iesire va arata ca functia strcmp() a identificat sirul "abcd"
ca fiind mai mare decat "ABCE", ca de altfel si functia strncmp().
Aceasta s-a intamplat deoarece literele minuscule au in 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 "abcd" ca fiind
mai mic decat "ABCE", precum si ca functia strcasecmp() a identificat
sirul "abcd" ca fiind egal cu "ABCE".
<titlu>Descoperirea si extragerea sub-sirurilor</titlu>
PHP include numeroase functii care gasesc si extrag sub-tiruri, adica parti
dintr-un sir. Cele mai importante functii de acest gen sunt rezumate in
tabelul 9-7.
<tabel 9-7 Functii PHP de extragere si cautare>
*Functie
* Descriere
*strchr(s1,s2)
*Returneaza toate sirurile s1 de la prima aparitie a sirului s2 si pana
la sfarsit. 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 pana
la sfarsit. 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 intreaga a primei aparitii a sirului s2 in
s1.Daca s2 nu este gasit, functia returneaza false.
*strrchr(s1,s2)
* Returneaza toate sirurile s1 de la ultima aparitie a sirului s2 si pana
la sfarsit. 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 pana
la sfarsit. Daca s1 nu este gasit, functia returneaza false.Functia strchr()
executa aceeasi operatie.
*substr(s,sfarf) substr(s,start,lung)
*Returneaza portiunea sirului s specificata de indexul intreg start respectiv
de indexurile start si lung. Prima pozitie a sirului este pozitia 0.
</tabel 9-7>
Iata un exemplu simplu, care prezinta modalitatile de utilizare a mai multor
functii de extragere si cautare:
$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\”):$r”;
$s = „the cat on the mat near the bat”;
$b = „at”;
$n = strrchr($s, $b); echo „<BR>strrchr(\”$s\”, \”$b\”):$r”;
$s = „the cat on the mat near the bat”;
$rezultat = substr($s, 4, 3); echo „<BR>substr(\”$s\”, 4, 3):$rezultat”;
Iata si datele de iesire ale exemplului: 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 in utilizarea functiei strpos() consta in
aceea ca poate fi greu de sesizat diferenta dintre valoarea returnata 0, care
arata ca sub-sirul a fost gasit in 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 incat sa se poata face diferenta
intre cele doua rezultate:
$poz = strpos($s1, $s2); if ($poz === false)
A
//sub-sirul nu a fost gasit…
S
Procedeul prezentat foloseste operatorul de identitate (===) pentru a determina
daca valoarea returnata este identica - nu doar aritmetic egala - cu valoarea
false. Daca folositi in schimb operatorul de egalitate, este posibil ca
rezultatul sa fie incorect; false are valoarea numerica zero, valoare returnata
si daca sub-sirul este gasit in pozitia initiala a sirului.
<Avertisment>
Acest procedeu presupune utilizarea versiunii PHP 4.0b3 sau a unei versiuni
ulterioare; in versiunile anterioare ale limbajului PHP, functia strpos()
returna o valoare sir. Daca folositi o versiune anterioara a limbajului PHP,
examinati manualul PHP pentru mai multe informatii referitoare la functia strpos().</Avertisment>
<titlu>Inlocuirea unui sub-sir</titlu>
O operatie frecvent folosita in programare consta in gasirea unui
sub-sir si inlocuirea sa cu o valoare noua. PHP are doua functii deosebit
de utile pentru asemenea operatii, si anume str_replace() si substr_replace().
In tabelul 9-8 sunt prezentate pe scurt aceste functii. Remarcati ca functia
str_replace() noteaza sub-sirul prin valoarea sa, in timp ce functia substr_replace()
noteaza sub-sirul prin pozitia sa in interiorul sirului subiect.
<tabel 9-8 Functii PHP de inlocuire a sub-sirurilor>
*Functie
*Descriere
*str_replace(cauta, inlocuire, subiect)
*Se cauta in sirul subiect sub-sirul cauta; daca sub-sirul este gasit,
returneaza valoarea subiect, inlocuindu-se prima aparitie a sirului cauta
cu inlocuire.
*substr_replace(subiect, inlocuire, start, lungime)
*Returneaza valoarea subiect, inlocuind sub-siruf care incepe de
la start si avand lungimea lungime cu sirul inlocuire.
</tabel 9-8>
Iata un exemplu care prezinta modul de utilizare a acestor functii:
$subiect = „the cat on the mat near the bat”;
$cauta = „cat”;
$inlocuire = „CAT”;
$rezultat = str_replace ($cauta, $inlocuire, $subiect);
echo „<BR>str_replace(\”$cauta\”, \”$inlocuire\”,
\”$subiect\”):$rezultat”;
$inlocuire = „CAT”;
$rezultat = substr_replace($subiect, $inlocuire, 4, 3); echo „<BR>substr_replace(\”$subiect\”, \”$inlocuire\”,
4, 3):$rezultat”;
Iata si datele de iesire ale exemplului:
str_replace(„cat”, „CAT”, „the cat on the mat
near the bat”): the CAT on the mat near the bat substr_replace(„the cat on the mat near the bat”, „CAT”,
4, 3): the CAT on the mat near the bat
<titlu>Stabilirea unei identitati intre caractere</titlu>
Una dintre cele mai puternice caracteristici ale limbajului PHP o constituie
capacitatea acestuia de a folosi expresiile regulate, o sintaxa speciala pentru
specificare seturilor de siruri. Utilitatea cea mai frecventa a unei expresii
regulate consta in a determina daca un sir subiect contine sau nu un sub-sir
identic cu expresia regulata respectiva. Veti invata sa efectuati operatia
respectiva mai tarziu, pe parcursul sub-sectiunii. Inainte de a
ajunge la aceasta, sa invatam sa formam expresii regulate.
<titlu>Scrierea expresiilor regulate</titlu>
Sa presupunem, de exemplu, ca doriti sa specificati un sir care poate include
litera b sau litera c. Puteti face aceasta folosind expresia regulata abci.
Prin inclu¬derea valorilor posibile intre paranteze, formati o expresie
regulata echivalenta cu formularea „alege oricare din aceste valori".
Sa presupunem ca doriti sa specificati un sir care poate include orice vocala;
expresia regulata aaeioui va poate fi de ajutor. Daca doriti sa permiteti si
utilizarea, majusculelor, puteti scrie aaeiouAEIOUi.
Sa presupunem ca doriti sa specificati un sir care poate include orice caracter
scris cu minuscule. Puteti scrie:
aabcdefghijklmnopqrstuvwxyzi
Sau puteti folosi forma mai compacta aa-zi, unde prin cratima se intelege
o serie de caractere consecutive.
Sa presupunem ca doriti sa specificati sirurile "sat", "mat"
si "lat". Pentru aceasta, aveti nevoie de expresia regulata asmliat.
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 intre parantezele
drepte, acesta are ca efect inversarea semnificatiei expresiei regulate plasate
intre paranteze. De exemplu, expresia regulata a^a-zi corespunde oricarui
caracter diferit de un caracter scris cu minuscule.
Pentru a specifica faptul ca o expresie regulata se poate repeta, expresia regulat
va fi urmata de o pereche de paranteze acolade, care includ limitele superioara
si
inferioara ale repetitiei. De exemplu, expresia regulata aaeioui A1,4S corespunde
unui sir care este compus din 1-4 vocale. Pentru a specifica repetarea mai multor
parti ale unei expresii regulate, includeti partile respective intre paranteze.
De exemplu, expresia regulata (asmliat)A1 ,2S corespunde unui numar de una sau
doua repetari ale oricaruia dintre sirurile "sat", "mat"
sau "lat".
Unele valori care se repeta sunt atat de frecvent folosite, incat
au abrevieri:
<tabel>
*Abreviere
*Semnificatie
*+
*A1, nS, unde n este un numar arbitrar de mare
**
*A0, nS, unde n este un numar arbitrar de mare
*?
*A0,1S
</tabel>
Sa presupunem ca doriti sa reprezentati o inmultire. Daca folositi caractere
minuscule pentru operanzi, puteti obtine ceva de genul aa-zi*aa-zi. 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: aa-zi\*aa-zi.
Pentru a specifica faptul ca o expresie regulata corespunde numai unui sub-sir
care include caracterul initial al unui sir subiect, prefixati expresia regulata
cu un accent circumflex. De exemplu, expresia regulata "asmliat corespunde
sub-sirurilor "sat", "mat" sau "lat" numai daca
acestea apar la inceputul sirului subiect. Similar, pentru a arata ca
o expresie regulata corespunde numai unui sub-sir care include caracterul final
al unui sir subiect, anexati la expresia regulata un simbol al dolarului. De
exemplu, expresia regulata asmliat$ corespunde sirurilor "sat", "mat"
sau "lat" numai daca acestea apar la sfarsitul sirului subiect.
Expresia regulata ^asmliat$ corespunde sub-sirurilor "sat", "mat"
sau "lat" numai daca sirul subiect este identic cu unul dintre aceste
sub-siruri.
<Sugestie>
Expresiile regulate includ si alte instrumente in afara celor descrise
pana acum, instru¬mente al caror numar este prea mare pentru a putea
fi explicate intr-un singur capitol. Nici macar in manualul PHP
pe suport electronic nu exista o descriere completa a expresiilor regulate.
Daca aveti acces la paginile de manual instalate cu PHP, puteti citi o descriere
completa a expresiilor regulate acceptate de PHP, care sunt compatibile cu standardul
POSIX 1003.2. Standardul POSIX este un document costisitor, protejat prin legislatia
drepturilor de autor. Daca nu puteti obtine accesul la paginile de manual PHP
sau la standardul POSIX, puteti gasi un indrumar util privind expresiile
regulate, scris de Dario F. Gomes, la adresa https://www.phpbuilder.com.</sugestie>
<titlu>Utilizarea expresiilor regulate</titlu>
PHP include numeroase functii care lucreaza cu expresii regulate. Tabelul 9-9
descrie aceste functii. Sub-sectiunea de fata explica functia ereg(); pentru
informatii privind celelalte functii, consultati manualul PHP.
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; in caz contrar, returneaza
false. Iata un exemplu simplu:
$model = „asmliat”;
$subiect = „La noi in sat”;
$rezultat = ereg($model, $subiect);
Variabila $rezultat primeste valoarea true, deoarece sirul subiect contine
sub-sirul "sat", care corespunde expresiei regulate.
Forma mai complexa a functiei ereg() include un al treilea argument, un tablou
care primeste sub-siruri ce corespund portiunilor scrise intre paranteze
ale modelului. Proiectul aferent capitolului curent prezinta modul de utilizare
a acestei forme a functiei ereg(), pe care o foloseste pentru a determina daca
un sir contine o adresa de e-mail corect formata.
<tabel 9-9 Functii PHP pentru expresii regulate>
*Functie
*Descriere
*ereg
*Executa o identificare cu o expresie regulata
*ereg_replace
*Inlocuieste un sub-sir care corespunde unei expresii regulate
*eregi
*Executa o identificare cu o expresie regulata insensibila la diferenta intre
majuscule si minuscule
*eregi_replace
*Inlocuieste un sub-sir care corespunde unei expresii regulate insensibile
la diferenta intre majuscule si minuscule
*split
*Divide un sir intr-un tablou folosind o expresie regulata
*spliti
*Divide un sir intr-un tablou folosind o expresie regulata (insensibila
la diferenta intre majuscule si minuscule)
*sql_regcase
*Creeaza o expresie regulata insensibila la diferenta intre majuscule
si minuscule dintr-un sir care contine o expresie regulata.
</tabel 9-9>
<Sfatul specialistului >
Intrebare: Acest capitol explica modul de generare a unor date de iesire
formatate. Exista vreo modalitate simpla de baleiere a datelor de intrare formatate?
Raspuns: Functia PHP sscanf (), adaugata in versiunea PHP 4.01, este complementara
functiei printf (). Daca functia printf () genereaza date de iesire formatate,
functia sscanf () citeste un sir, il interpreteaza prin referirea la un
sir de formatare si stabileste valorile variabilelor specificate in functie
de continutul sirului.
Sa luam in considerare urmatorul exemplu:
$subiect = "01,31,2005";
$n = sscanf($subiect, "%d,%d,%d", &$luna, &$zi, &$an);
echo "<BR>Au fost gasite $n valori:"; echo "<BR>luna=$luna"; echo "<BR>zi=$zi"; echo "<BR>an=$an";
Datele de iesire ale acestui exemplu sunt:
Au fost gasite 3 valori: luna=1 zi=31 an=2005
Pentru mai multe informatii privind functia sscanf (), consultati manualul PHP.
</Sfatul specialistului >
<Test „la minut">
• Ce functie PHP executa cautarea sensibila la diferenta intre majuscule
si minuscule a unui sir subiect al unui sub-sir dat, examinand un numar
maxim dat de caractere?
• Ce functie PHP extrage un sub-sir al unui sir subiect, in functie
de pozitia initiala si de lungimea sub-sirului?
• Scrieti o expresie regulata care corespunde numai sub-sirurilor "jos",
"ros" si "cos" care apar la inceputul unui sir. </Test
„la minut">
<titlu>Proiect 9-1: O rutina de identificare a echivalentelor cu expresii
regulate</titlu>
In cadrul acestui proiect, veti construi o pagina care va permite sa
intro¬duceti un sir si o expresie regulata, precum si sa cautati in
sirul respectiv un sub-sir care corespunde expresiei regulate. Puteti folosi
acest proiect pentru a va imbunatati cunostintele in materie de
expresii regulate.
<titlu>Scopurile proiectului</titlu>
• Prezentarea modului de utilizare a functiei ereg()
• Prezentarea modului de testare a formularului cu date introduse de utilizator
• Prezentarea modului de validare a unei adrese de e-mail
<titlu>Pas cu pas</titlu>
1. Plasati urmatorul script PHP intr-un fisier denumit p-9-1 .php si incarcati
acest fisier in serverul dumneavoastra PHP:
<?php echo "<BR><B>sir:</B> $sir"; echo "<BR><B> expresie regulata:</B> $model"; if (get_magic_quotes_gpc())
<nota>
Raspunsuri la test:
• strncmp()
• substr()
• ^ajrcios
</nota>
A echo "<BR><BR>"; echo "<BR>Eliminarea ghilimelelor magice....";
$sir = stripslashes($sir);
$model = stripslashes($model); echo "<BR><B>sir:</B> $sir"; echo "<BR><B>expresie regulata:</B> $model";
S
$gasit = ereg($model, $sir, $echivalente); echo "<BR><BR>"; if ($gasit)
A echo "<BR><B>valabil:</B> true"; echo "<BR><BR>"; echo "<BR><B>Componente: </B>"; for ($i = 0; $i < count($echivalente); $i++)
A echo "<BR>$ echivalente a$ii";
S
S else echo "<BR><B>valabil:</B> false";
?>
2. Plasati urmatorul text HTMLintr-un fisier denumit p-9-1 .html si incarcati
acest fisier in serverul dumneavoastra, inserandu-l in acelasi
catalog ca si fisierul p-9-1 .php:
<HTML>
<HEAD>
<TITLE>Proiect 9-1</TITLE>
</HEAD>
<BODY>
<H2>Proiect 9-1:Testarea expresiilor regulate</H2>
<FORM METHOD=”POST” ACTION=”p-9-1.php”>
<FONT FACE=”Courier”>
Sir:
<BR>
<INPUT TYPE=”TEXT” NAME=”sir”>
<BR><BR>
Expresie regulata:
<BR>
<INPUT TYPE=”TEXT” SIZE=64 NAME=”model”>
VALUE=”^(a_a-zA-Z0-9-i+)@(a_a-zA-Z0-9-i+(.a_a-zA-Z0-9-i+)*)$”>
<BR><BR>
<BR>
<INPUT TYPE=”SUBMIT”>
</FONT>
</FORM>
</BODY>
</HTML>
3. Alocati un timp studiului scriptului HTML. Observati apelul la functia get_magic_quotes_gpc().|
Aceasta functie returneaza o valoare corespunzatoare optiunii PHP magic_quotes_gpc,
configurata de administratorul de sistem PHP. Daca aceasta optiune este activata,
PHP,, adauga automat caractere backslash la variabilele din formular, astfel
incat valorile lor: poata fi folosite in contexte care impun
protectia caracterelor speciale. Aceasta carac¬teristica nu este utila la
introducerea, vizualizarea si utilizarea unei expresii regulate.
Deci, daca optiunea este activata, scriptul foloseste functia stripslashes()
pentru a elimina toate caracterele slash nedorite adaugate in mod automat
de PHP. Pentru a vedea de ce este necesar acest lucru, puteti elimina instructiunea
if si corpul sau din script si apoi incercati sa rulati scriptul. Daca
optiunea magic_quotes_gpc este activata in versiunea limbajului PHP instalata
in sistemul dumneavoastra, scriptul nu va functiona in mod corespunzator.
4. Alocati un timp studiului paginii HTML. Acordati o atentie speciala expresiei
regulate specificate ca valoare prestabilita a casetei cu text denumite model.
Aceasta expresie regulata aproximeaza forma unei adrese de e-mail. Cu toate
acestea, nu este o reprezentare perfecta. Cautarea expresiei regulate perfecte
pentru reprezentarea adreselor corecte de e-mail este asemanatoare cu expeditiile
medievale intreprinse pentru gasirea Sfantului Graal*. Puteti gasi
si alte potentiale expresii regulate la adresa https:// www.phpbuilder.com si
in manualul PHP adnotat.
<ecran>
Project 9-2: Regular Expression Tester
<campuri>
String:
Regular Expression:
^(a_a-zA-Z0-9-i+)@(a_a-zA-Z0-9-i+(.a_a-zA-Z0-9-i+)*)$
</campuri>
<buton> Submit Query </buton>
</ecran>
5. Orientati un browser Web spre adresa URL a fisierului HTML incarcat
anterior. Ecranul browserului trebuie sa fie asemanator celui prezentat in
ilustratia urmatoare. Introduceti o valoare a sirului si, daca doriti, inlocuiti
valoarea expresiei regulate, dupa care executati clic pe butonul „Trimite
interogarea".
6. La executia scriptului, acesta incearca sa stabileasca o echivalenta
intre expresia regulata si un sub-sir al sirului si afiseaza rezultatul.
Un rezultat caracteristic este prezentat alaturat.
<ecran>
string: bill@osborne.com regular expression: ^(a_a-zA-Z0-9-i+)@(aa-zA-Z0-9-i+(.aa-zA Z0-9-i+)*)$
Stripping magic quotes.... string: bill@osborne.com regular expression: ^(a_a-zA-Z0-9-i+)@(aa-zA-Z0-9-i+(.aa-zA Z0-9-i+)*)$
valid: true
Components: bill@osborne.com bill osborne.com
.corn
</ecran>
<nota>
In original Holy Grail (Sfantul Graal) - in legendele anglo-saxone,
un potir folosit de lisus la Cina cea de Taina si in care losif din Arimateea
a cules ultimele picaturi din sangele lui lisus rastignit pe Cruce; folosit
frecvent ca simbol al puritatii crestine sau ca rasplata a acesteia. - N.T.
</nota>
<Test de evaluare>
1. Scrieti un sir de formatare care specifica o valoare sir aliniata la stanga,
care trebuie sa ocupe 24 de spatii, urmata de o valoare de tip double aliniata
la stanga, cu doua cifre zecimale.
2. Scrieti o secventa escape care reprezinta caracterul a carui valoare ASCII
este 45 in octal.
3. Scrieti un apel de functie si o atribuire care stocheaza in variabila
$r valoarea variabilei $s si care elimina caracterele de tip spatiu alb de la
inceput si de la sfarsit.
4. Scrieti un apel de functie care returneaza un sir asemanator cu $s, dar ale
carui n caractere, numarate de la pozitia i, sunt inlocuite prin sirul
$r.
5. Scrieti o expresie regulata care corespunde numai sub-sirurilor "axb",
"ayb" si "azb" care apar la sfarsitul unui sir subiect.
</Test de evaluare>