Welcome, guest. You are not logged in.
Language / Choose language
 
Username Password  
Today: WHERE COUNTRY IS BEST IN ASIA? · More of this
    Search
 

   

Modul #9
139

<titlu>Modulul 9: Utilizarea ºirurilor</titlu>
<titlu>Scopuri</titlu>
• Învãþaþi sã utilizaþi secvenþe escape suplimentare pentru a include în ºiruri caracterele speciale
• învãþaþi sã folosiþi ºiruri încadrate între ghilimele simple
• învãþaþi sã utilizaþi codurile ASCII
• învãþaþi sã creaþi date de ieºire formatate
• învãþaþi sã folosiþi o varietate de funcþii ºir PHP, care vã permit sã cãutaþi si sã manipulaþi ºiruri

În Modulul 2 au fost prezentate ºirurile, tipul de date PHP care stocheazã texte, în cadrul modulului de faþã, veþi învãþa mai multe despre utilizarea ºirurilor.

<tilu>Crearea ºi afiºarea ºirurilor</titlu>
Pânã acum, aþi învãþat numeroase aspecte despre ºiruri. Sã recapitulãm noþiunile elementare înainte de a aborda" subiecte mai complexe:
• Valorile literale de tip ºir sunt secvenþe de caractere incluse între ghilimele duble.
• Puteþi include un caracter special în cadrul unui ºir folosind o secvenþã escape care reprezintã caracterul special.
• Variabilele pot fi de tip string ºi li se poate atribui o valoare de tip ºir prin intermediul operatorului de atribuire.
• Operatorul de concatenare ( . ) se poate folosi pentru unirea ºirurilor.
• PHP poate converti în mod automat o valoare numericã într-un ºir, respectiv valoarea unui ºir într-un numãr.
Dacã vreunul din aceste aspecte fundamentale vi se pare necunoscut, parcurgeþi materialul corespunzãtor din capitolele 2 sau 5 înainte de a continua.
<titlu>Secvenþe escape suplimentare</titlu>
Modulul 2 a prezentat numeroase secvenþe escape pe care le puteþi folosi pentru a include caractere speciale în cadrul ºirurilor. Cu toate acestea, PHP include douã secvenþe escape care nu au fost descrise în Modulul 2. Tabelul 9-1 prezintã setul complet de secvenþe escape folosite în PHP.

140

<tabel 9-1 Secvenþele escape folosite în PHP>
*Secvenþa escape
*Semnificaþie

*\n
*salt la linie nouã

*r
*retur de car

*\t
*caracter de tabulare pe orizontalã

*\\
*backslash

*$
*simbolul dolarului

*”
*ghilimele duble

*\xxx
*caracterul asociat valorii ASCII xxx. exprimatã sub forma unui numãr
în octal

*\xnn
*caracterul asociat valorii ASCII xxx, exprimatã sub forma unui numãr
în hexazecimal
</tabel 9-1>

Ultimele douã secvenþe escape prezentate în tabelul 9-1 nu au fost descrise în Modulul 2. Fiecare dintre aceste secvenþe escape foloseºte un cod ASCII (America Standard Code for Information Interchange) pentru reprezentarea unui caracter. Codurile ASCII sunt valori întregi, care sunt cuprinse între 0 ºi 255; fiecare literã 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 secvenþã escape necunoscutã vã permite sã folosiþi reprezentarea în octal (baza 8) a unui cod ASCII pentru specificarea caracterului corespunzãtor. De exemplu, valoarea zecimalã 65 (care este codul ASCII al literei A) poate fi repre­zentatã în octal sub forma 101. Ca atare, puteþi reprezenta litera A folosind secvenþl escape "\101".
Cea de-a doua secvenþã escape necunoscutã vã permite sã folosiþi reprezentarea hexazecimalã (în baza 16) a unui cod ASCII pentru specificarea caracterului corespunzãtor. De exemplu, valoarea zecimalã 65 (care este codul ASCII al literei A) poate fi reprezentat sub forma hexazecimalã 41. Ca atare, puteþi reprezenta litera A cu ajutorul secvenþei escape „\41".
Dacã aveþi nevoie de o reactualizare a cunoºtinþelor dumneavoastrã în materie de lucrul cu baze de numeraþie diferite, sã ne reamintim cã valoarea unui numãr zecimal este suma produselor dintre fiecare cifrã care îl compune ºi o putere a lui 10. De exemplu, numãrul 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. Puteþi determina valoarea unui numãr reprezentat folosind o altã bazã prin înlocuirea lui 10 cu valoarea bazei respective într-o expresie ca aceea prezentatã anterior. De exemplu, valoarea hexazecimalã 123 este echivalentã cu valoarea zecimalã 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 echivalentã cu valoarea zecimalã 1x8 la puterea 2 + 2x8 la puterea 1 + 3x8 la puterea 0=1x64 + 2x8 + 3xl=83. Dacã algebra nu a fost materia dumneavoastrã preferatã, nu intraþi în panicã; în subsecþiunea urmãtoare veþi învãþa sã determinaþi valoarea în octal sau hexazecimal echivalentã cu orice valoare zecimalã.

141

<titlu>Utilizarea codurilor ASCII</titlu>
Numeroase funcþii PHP sunt deosebit de folositoare la utilizarea codurilor ASCII. Aceste funcþii sunt enumerate în tabelul 9-2.
Iatã un scurt exemplu de utilizare a funcþiei ord() pentru a determina codul ASCII corespunzãtor unui anumit caracter:

$c = „A”;
$n ord($c);
echo „<BR>Valoarea ASCII a caracterului $c este $n;

Datele de ieºire ale exemplului respectiv sunt urmãtoarele:

Valoarea ASCII a caracterului A este 65

Iatã un exemplu care afiºeazã echivalentele în zecimal, octal, respectiv hexazecimal al caracterelor ASCII ale cãror coduri sunt cuprinse între 32 ºi 127:

for ($i=32; $i<128; $i++)
{
$c=chr($i);
$octal = decoct($i)
$hex = dechex($i);
echo „<BR>$i (octal $octal, hex $hex): $c”;
}

Domeniul dat include caracterele ASCII care se pot afiºa. Iatã o selecþie din datele de ieºire 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):$

Remarcaþi corespondenta codului ASCII 32 cu un caracter spaþiu.

<tabel 9-2 Funcþii folositoare în utilizarea codurilor ASCII>

*Funcþie
*Descriere

*chr(/n)
* Returneazã caracterul având codul ASCII dat de n.

*dechex(n)
*Returneazã valoarea hexazecimalã echivalentã cu valoarea zecimalã datã de n.

*decoct(n)
*Returneazã valoarea în octal echivalentã cu valoarea zecimalã datã de n.

*hexdec(n)
*Returneazã valoarea zecimalã echivalentã cu valoarea hexazecimalã datã de n.

*octdec(n)
*Returneazã valoarea zecimalã echivalentã cu valoarea în octal datã de n.

*ord(c)
*Returneazã codul ASCII echivalent caracterului c.
</tabel 9-2>

<titlu>ªiruri delimitate între ghilimele simple</titlu>
Dacã preferaþi, puteþi delimita un ºir între ghilimele simple, nu neapãrat duble. Un motiv în acest sens îl constituie facilitarea posibilitãþii de includere a ghilimelelor

142

duble în ºir; dacã delimitaþi un ºir între ghilimele duble, toate ghilimelele duble din cadrul ºirului trebuie corelate cu un caracter backslash:

„\”Stop\”, striga el, \ “sau trag!\””

Acesta este un ºir care conþine nume­roase ghilimele duble. - N.T.

Acest ºir poate fi scris într-un mod mai convenabil astfel:

’ ”Stop”, striga el, „sau trag!” ’

ªirurile delimitate între ghilimele simple se comportã într-un mod diferit faþã de ºirurile delimitate prin ghilimele duble:
• Singurele secvenþe escape permise în cadrul ºirurilor delimitate prin ghilimele simple sunt \ \ ºi \'.
• Nu se executã substituþia variabilelor atunci când datele de ieºire sunt reprezentate printr-un ºir delimitat prin ghilimele simple.
În consecinþã, datele de ieºire ale urmãtorului exemplu

$x = „text”;
echo ’x este $x.’;

sunt urmãtoarele:

x este $x.

ºi nu

x este text.

<titlu>Crearea datelor de ieºire formatate</titlu>
PHP include douã funcþii utile pentru generarea datelor de ieºire formatate, în speþã printf () ºi sprintf (). Funcþia printf () afiºeazã datele sale de ieºire, în timp ce funcþia sprintf () returneazã datele sale de ieºire sub forma unei valori ºir. În general, fiecare funcþie preia douã sau mai multe argumente. Primul argument este un ºir, denumit ºir de formatate, care specificã formatul datelor de ieºire, iar celelalte argumente specificã valorile care vor constitui datele de ieºire. Iatã un exemplu simplu de utilizare a funcþiei printf ():

Printf(„Valoarea lui n este: %d”,$n);

Iatã ºi un exemplu mai complicat, care prezintã modul de utilizare a funcþiei sprintf () cu mai multe argumente pentru datele de ieºire:

$rezultat = sprintf(„Valori: %d, %f, $n, $x);

ªirul de formatare constã dintr-o serie de caractere ºi directive ordinare. Un caracter ordinar este orice caracter, în afara caracterului %. Caracterele ordinare sunt pur ºi simplu copiate la ieºire.

143

Directivele reprezintã secvenþe de caractere care încep cu simbolul %; aceste determinã modul în care va fi formatat argumentul corespunzãtor. O directivã simplã, cum este cea din exemplul precedent, poate consta dintr-un caracter % urmat de un specificator de tip, precum d, care aratã cã argumentul trebuie tratat ca numãr zecimal. Cu toate acestea, o directivã mai sofisticatã poate include urmã­toarele componente, care trebuie sã aparã în ordinea indicatã:
• Specificator de completare (opþional): Un specificator de completare precizeazã caracterul care se va folosi pentru a completa rezultatul pânã la dimensiunea cerutã a ºirului, în cazul în care caracterul de completare este omis, rezultatul este completat cu spaþii. Specificatorul de completare poate fi un caracter spaþiu sau un 0 (zero). Un specificator de completare de tip spaþiu este folosit frecvent cu ºirurile, iar un specificator de completare zero se foloseºte mai ales alãturi de numere. Un alt caracter de completare poate fi specificat prin prefixarea acestuia cu un singur semn al citãrii ('). De exemplu, pentru a completa un rezultat cu liniuþe de subliniere, specificaþi '_ drept caracter de completare.
• Specificator de aliniere (opþional): Un specificator de aliniere indicã dacã rezultatul trebuie sã fie aliniat la stânga sau la dreapta. Dacã specificatorul de aliniere este omis, rezultatul va fi aliniat la dreapta; dacã se indicã o cratimã (-) drept specificator de aliniere, rezultatul va fi aliniat la stânga.
• Specificator de lãþime (opþional): Un specificator de lãþime este un întreg care determinã numãrul minim de caractere ale rezultatului; sau, dacã argumentul este de tip double, numãrul minim de caractere situate la stânga punctului zecimal. Dacã rezultatul conþine un numãr mai redus de caractere, atunci va conþine ºi caractere de completare.
• Specificator de precizie (opþional): Un specificator de precizie este un punct zecimal, urmat de un întreg care determinã numãrul de cifre dupã punctul zecimal pe care trebuie sã le conþinã rezultatul. Specificatorul de precizie nu are nici un efect pentru alte tipuri decât double.
• Specificator de tip (obligatoriu): Specificatorul de tip determinã modul de tratare ºi afiºare a argumentului. Tabelul 9-3 rezumã specificatorii de tip disponibili.

<tabel 9-3 Specificatorii de tip PHP folosiþi la formatarea ºirurilor>

*Specificator de tip
*Descriere

*b
*Trateazã argumentul ca pe un întreg ºi îl afiºeazã ca valoare binarã.

*c
*Trateazã argumentul ca pe un întreg ºi afiºeazã caracterul cu aceeaºi valoare ASCII ca ºi argumentul.

*d
*Trateazã argumentul ca pe un întreg ºi îl afiºeazã ca valoare zecimalã.

*f
*Trateazã argumentul ca pe o valoare de tip double ºi îl afiºeazã ca valoare cu virgulã mobilã.

144

*o
*Trateazã argumentul ca pe un întreg ºi îl afiºeazã ca pe o valoare scrisã în octal.

*s
*Trateazã argumentul ca pe un ºir ºi îl afiºeazã.

*x
*Trateazã argumentul ca pe un întreg ºi îl afiºeazã ca numãr hexazecimal, cu litere scrise cu minuscule.

*X
*Trateazã argumentul ca pe un întreg ºi îl afiºeazã ca numãr hexazecimal, cu litere scrise cu majuscule.
</tabel 9-3>

Dacã doriþi sã inseraþi simbolul procentului în datele de ieºire ale unui apel la funcþia printf () sau sprintf (), inseraþi douã caractere % în locul dorit. La apariþia a douã caractere %, funcþiile printf () ºi sprintf () ºtiu cã doriþi sã inseraþi un simbol al procentului, nu o directivã de formatare.
Tabelul 9-4 prezintã rezultatele aplicãrii a diferite ºiruri de formatare valorilor selectate. Studiaþi tabelul ºi verificaþi dacã aþi înþeles corect modul de operare a specificatorilor din cadrul fiecãrui ºir de formatare. Remarcaþi cã, în cazul omiterii cifrelor zecimale, se produce automat o rotunjire.
< remarcã >
În tabelul 9-4, spaþiile au fost înlocuite prin accente circumflexe, pentru a facilita deter­minarea numãrului de spaþii ºi a amplasãrii acestora.</remarcã>

<tabel 9-4 Exemple de rezultate ale utilizãrii a diferite ºiruri 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>

145

<Sfatul specialistului>
Întrebare:Utilizarea funcþiilor printf () ºi sprintf () pentru formatarea numerelor pare cam greoaie. Nu existã ºi alte metode?
Rãspuns: Dacã preferaþi, puteþi folosi funcþia number_format(), care returneazã o valoare de tip ºir conþinând un rezultat formatat. Puteþi apela funcþia cu unul, douã sau patru argumente:
number_format(numar)
number_format(numãr, zecimale)
number_format(numãr, zecimale, punct_zecimal, separator_mii)

Argumentul numãr specificã valoarea numericã pe care doriþi sã o formataþi. Argumentul zecimale specificã numãrul dorit de cifre zecimale. Argumentul punct_zecimal precizeazã caracterul ce se va folosi drept punct zecimal, iar argu­mentul separator_mii precizeazã caracterul care se va folosi ca separator al miilor. În mod prestabilit, rezultatul este formatat fãrã zecimale, este inserat un punct (.) înaintea cifrelor care compun partea zecimalã, respectiv se foloseºte o virgulã (,) pentru separarea miilor.
De exemplu, apelul la funcþia number_format(1.234, 2)
returneazã valoarea 1.23 </Sfatul specialistului>

<Test „la minut">
• Scrieþi secvenþa escape care reprezintã caracterul a cãrui valoare ASCII este datã de valoarea în octal 17.
• Scrieþi secvenþa escape care reprezintã caracterul a cãrui valoare ASCII este datã de valoarea hexazecimalã l f.
• Denumiþi funcþia care returneazã valoarea hexazecimalã a unui numãr zecimal.
• Scrieþi un ºir de formatare care genereazã un numãr cu virgulã mobilã cu douã cifre zecimale.
</Test „la minut”>

<notã>
Rãspunsuri la test:
• "\017"
• "\x1f"
• dechex()
• „%.2f”
</notã>

146

<titlu>Manipularea ºirurilor</titlu>
PHP conþine peste 70 de funcþii care lucreazã cu ºiruri. Aceastã secþiune descrie numeroase funcþii pe care este posibil sã le utilizaþi frecvent. Aceste funcþii vã permit sã obþineþi lungimea unui ºir, sã eliminaþi dintr-un ºir caracterele de tip spaþiu alb ºi sã convertiþi caracterele unui ºir în majuscule sau minuscule.

<titlu>Obþinerea lungimii unui ºir</titlu>
Funcþia strlen() returneazã lungimea ºirului specificat ca argument al funcþiei. Iatã un exemplu simplu de utilizare a funcþiei strlen():

$s = „Acesta este un ºir.”;
$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 ºir</titlu>
Numeroase funcþii PHP vã permit sã eliminaþi caracterele de tip spaþiu alb de la una sau ambele extremitãþi ale unui ºir. Caracterele de tip spaþiu alb sunt caractere precum spaþiu, tabulator ºi caracter de salt la linie nouã, care nu dispun de nici o reprezentare vizibilã. Aceste funcþii sunt prezentate în tabelul 9-5. Iatã un exemplu; care prezintã modul de operare al acestor funcþii.

$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”;

147

Iatã ºi datele de ieºire 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 Funcþii PHP de eliminare a caracterelor din ºiruri>
*Funcþie
*Descriere

*chop(s)
*Returneazã valoarea lui s, eliminând spaþiile albe de la extremitatea din dreapta a ºirului. Similar cu rtrim().

*ltrim(s)
*Returneazã valoarea lui s, eliminând spaþiile albe de la extremitatea din stânga a ºirului.

*rtrim(s)
*Returneazã valoarea lui s, eliminând spaþiile albe de la extremitatea din dreapta a ºirului. Similar cu chop().

*trim(s)
*Returneazã valoarea lui s, eliminând spaþiile albe de la ambele extremitãþi.

<titlu>Conversia ºirurilor la majuscule sau minuscule</titlu>
Funcþia strtoupper() returneazã valoarea argumentului sãu, convertitã la majuscule. Funcþia conexã strtolower{) returneazã valoarea argumentului sãu, convertitã la minuscule. Nici una din funcþii nu modificã valoarea argumentului sãu; valoarea convertitã este cea returnatã ca rezultat al funcþiei. Iatã un scurt exemplu, care prezintã modul de operare a acestor funcþii:

$s = „abcd”;
$rezultat = strtoupper($s);
echo „<BR>strtoupper($s): $rezultat”;
$s = „ABCD”;
$rezultat = strtolower($s);
echo „<BR>strtolower($s): $rezultat”;

Iatã ºi datele de ieºire generate de exemplul respectiv:

Strtoupper(abcd): ABCD
Strtolower(ABCD): abcd

<Test „la minut">
• Care este funcþia ce returneazã lungimea unui ºir?
• Care este funcþia care eliminã caracterele de tip spaþiu alb de la ambele extremitãþi ale unui ºir?
• Care este funcþia care converteºte caracterele unui ºir în minuscule? </Test „la minut">

<notã>
Rãspunsuri la test:
• strlen()
• trim()
• strtolower()</notã>

148

<Sfatul specialistului>
Întrebare: Aþi spus cã PHP include peste 70 de funcþii care utilizeazã ºiruri, dar aþi descris numai câteva. Cum pot afla detalii ºi despre celelalte funcþii?
Rãspuns: Secþiunea urmãtoare descrie unele funcþii PHP ºir care comparã ºiruri ºi executã cãutãri în ºiruri. Cu toate acestea, PHP include mult mai multe funcþii ºir decât cele care pot fi descrise în acest capitol. Pentru a afla mai multe detalii despre funcþiile ºir suplimentare, consultaþi manualul PHP pe suport electronic, la adresa http://www.php.net. </Sfatul specialistului>
<titlu>Compararea ºirurilor ºi cãutarea în ºiruri</titlu>
În secþiunea anterioarã aþi învãþat despre numeroase funcþii PHP care manipuleazã ºiruri, în aceastã secþiune, veþi afla detalii despre numeroase funcþii PHP care executã anumite categorii de operaþii cu ºiruri, ºi anume compararea ºi cãutarea.

<titlu>Compararea ºirurilor</titlu>
• PHP furnizeazã patru funcþii care sunt deosebit de utile pentru compararea ºirurilor. Aceste funcþii sunt enumerate în tabelul 9-6. Fiecare funcþie returneazã o valoare al cãrei semn determinã rezultatul comparaþiei; nu trebuie sã încercaþi sã interpretaþi valoarea returnatã efectivã. Funcþia strncasecmp() a fost adãugatã în versiunea PHP 4.0.2; dacã dispuneþi de o versiune anterioarã a limbajului PHP, nu aveþi la dispoziþie aceastã funcþie.

<tabel 9-6 Funcþii PHP de comparaþie între ºiruri>

*Funcþia
*Descriere

*strcasecmp(s1, s2)
*Executã o comparaþie fãrã sensibilitate la diferenþa între majuscule ºi minuscule. Returneazã o valoare mai micã decât zero dacã s1 este mai mic decât s2, o valoare mai mare decât zero dacã s1 este mai mare decât s2, respectiv 0 în celelalte cazuri.

*strcmp(s1, s2)
*Executã o comparaþie cu sensibilitate la diferenþa între majuscule ºi minuscule. Returneazã o valoare mai micã decât zero dacã s1 este mai mic decât s2, o valoare mai mare decât zero dacã s1 este mai mare decât s2, respectiv 0 în celelalte cazuri.

*strncasecmp(s1, s2, n)
*Executã o comparaþie fãrã sensibilitate la diferenþa între majuscule ºi minuscule. Returneazã o valoare mai micã decât zero dacã s1 este mai mic decât s2, o valoare mai mare decât zero dacã s1 este mai mare decât s2, respectiv 0 în celelalte cazuri. La comparaþie sunt luate în considerare un numãr de n caractere.

*strncmp(s1,s2, n)
*Executã o comparaþie cu sensibilitate la diferenþa între majuscule ºi minuscule.Returneazã o valoare mai micã decât zero dacã s1

149

este mai mic decât s2, o valoare mai mare decât zero dacã s1 este mai mare decât s2, respectiv 0 în celelalte cazuri. La com­paraþie sunt luate în considerare un numãr de n caractere.</tabel 9-6>


Iatã un scurt exemplu care prezintã modul de utilizare a acestor funcþii, precum ºi datele de ieºire 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.”;

Iatã ºi datele de ieºire ale exemplului:

Functia strcmp a returnat 1.
Functia strcnmp a returnat 1.
Functia strcasecmp a returnat -1.
Functia strncasecmp a returnat 0.

Datele de ieºire vã aratã cã funcþia strcmp() a identificat ºirul "abcd" ca fiind mai mare decât "ABCE", ca de altfel ºi funcþia strncmp(). Aceasta s-a întâmplat deoarece literele minuscule au în secvenþa ASCII o poziþie superioarã literelor scrise cu majuscule; litera A are valoarea ASCII 65, iar litera a are valoarea ASCII 97. De asemenea, datele de ieºire aratã cã funcþia strncasecmp() a identificat ºirul "abcd" ca fiind mai mic decât "ABCE", precum ºi cã funcþia strcasecmp() a identificat ºirul "abcd" ca fiind egal cu "ABCE".

<titlu>Descoperirea ºi extragerea sub-ºirurilor</titlu>
PHP include numeroase funcþii care gãsesc ºi extrag sub-þiruri, adicã pãrþi dintr-un ºir. Cele mai importante funcþii de acest gen sunt rezumate în tabelul 9-7.

<tabel 9-7 Funcþii PHP de extragere ºi cãutare>
*Funcþie
* Descriere

*strchr(s1,s2)
*Returneazã toate ºirurile s1 de la prima apariþie a ºirului s2 ºi pânã la sfârºit. Dacã s1 nu este gãsit, funcþia returneazã false. Funcþia strstr() executã aceeaºi operaþie.

150

*stristr(s1,s2)
* Returneazã toate ºirurile s1 de la prima apariþie a ºirului s2 ºi pânã la sfârºit. Dacã s1 nu este gãsit, funcþia returneazã false. ªirurile s1 ºi s2 sunt comparate fãrã a se þine cont dacã literele sunt majuscule sau minuscule.

*strpos(s1,s2)
* Returneazã poziþia întreagã a primei apariþii a ºirului s2 în s1.Dacã s2 nu este gãsit, funcþia returneazã false.

*strrchr(s1,s2)
* Returneazã toate ºirurile s1 de la ultima apariþie a ºirului s2 ºi pânã la sfârºit. Dacã s1 nu este gãsit, funcþia returneazã false. La comparaþie este folosit numai primul caracter al ºirului s2.

*strstr(s1,s2)
* Returneazã toate ºirurile s1 de la prima apariþie a ºirului s2 ºi pânã la sfârºit. Dacã s1 nu este gãsit, funcþia returneazã false.Funcþia strchr() executã aceeaºi operaþie.

*substr(s,sfarf)
substr(s,start,lung)
*Returneazã porþiunea ºirului s specificatã de indexul întreg start respectiv de indexurile start ºi lung. Prima poziþie a ºirului este poziþia 0.
</tabel 9-7>

Iatã un exemplu simplu, care prezintã modalitãþile de utilizare a mai multor funcþii de extragere ºi cãutare:

$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”;

Iatã ºi datele de ieºire 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 potenþialã dificultate în utilizarea funcþiei strpos() constã în aceea cã poate fi greu de sesizat diferenþa dintre valoarea returnatã 0, care aratã cã sub-ºirul a fost gãsit în poziþia iniþialã a ºirului, ºi valoarea returnatã false, care aratã cã sub-ºirul nu a fost gãsit. Iatã un scurt exemplu care indicã un mod adecvat de testare a valorii

151

returnate de funcþia strpos(), astfel încât sã se poatã face diferenþa între cele douã rezultate:

$poz = strpos($s1, $s2);
if ($poz === false)
{
//sub-sirul nu a fost gasit…
}

Procedeul prezentat foloseºte operatorul de identitate (===) pentru a determina dacã valoarea returnatã este identicã - nu doar aritmetic egalã - cu valoarea false. Dacã folosiþi în schimb operatorul de egalitate, este posibil ca rezultatul sã fie incorect; false are valoarea numericã zero, valoare returnatã ºi dacã sub-ºirul este gãsit în poziþia iniþialã a ºirului.
<Avertisment>
Acest procedeu presupune utilizarea versiunii PHP 4.0b3 sau a unei versiuni ulterioare; în versiunile anterioare ale limbajului PHP, funcþia strpos() returna o valoare ºir. Dacã folosiþi o versiune anterioarã a limbajului PHP, examinaþi manualul PHP pentru mai multe informaþii referitoare la funcþia strpos().</Avertisment>

<titlu>Înlocuirea unui sub-ºir</titlu>
O operaþie frecvent folositã în programare constã în gãsirea unui sub-ºir ºi înlocuirea sa cu o valoare nouã. PHP are douã funcþii deosebit de utile pentru asemenea operaþii, ºi anume str_replace() ºi substr_replace(). In tabelul 9-8 sunt prezentate pe scurt aceste funcþii. Remarcaþi cã funcþia str_replace() noteazã sub-ºirul prin valoarea sa, în timp ce funcþia substr_replace() noteazã sub-ºirul prin poziþia sa în interiorul ºirului subiect.
<tabel 9-8 Funcþii PHP de înlocuire a sub-ºirurilor>
*Funcþie
*Descriere

*str_replace(cautã, înlocuire, subiect)
*Se cautã în ºirul subiect sub-ºirul cautã; dacã sub-ºirul este gãsit, returneazã valoarea subiect, înlocuindu-se prima apariþie a ºirului cautã cu înlocuire.

*substr_replace(subiect, înlocuire, start, lungime)
*Returneazã valoarea subiect, înlocuind sub-ºiruf care începe de la start ºi având lungimea lungime cu ºirul înlocuire.
</tabel 9-8>

Iatã un exemplu care prezintã modul de utilizare a acestor funcþii:

$subiect = „the cat on the mat near the bat”;
$cauta = „cat”;
$inlocuire = „CAT”;
$rezultat = str_replace ($cauta, $inlocuire, $subiect);

152

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”;

Iatã ºi datele de ieºire 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 identitãþi între caractere</titlu>
Una dintre cele mai puternice caracteristici ale limbajului PHP o constituie capacitatea acestuia de a folosi expresiile regulate, o sintaxã specialã pentru specificare seturilor de ºiruri. Utilitatea cea mai frecventã a unei expresii regulate constã în a determina dacã un ºir subiect conþine sau nu un sub-ºir identic cu expresia regulatã respectivã. Veþi învãþa sã efectuaþi operaþia respectivã mai târziu, pe parcursul sub-secþiunii. Înainte de a ajunge la aceasta, sã învãþãm sã formãm expresii regulate.

<titlu>Scrierea expresiilor regulate</titlu>
Sã presupunem, de exemplu, cã doriþi sã specificaþi un ºir care poate include litera b sau litera c. Puteþi face aceasta folosind expresia regulatã [bc]. Prin inclu­derea valorilor posibile între paranteze, formaþi o expresie regulatã echivalentã cu formularea „alege oricare din aceste valori".
Sã presupunem cã doriþi sã specificaþi un ºir care poate include orice vocalã; expresia regulatã [aeiou] vã poate fi de ajutor. 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 forma mai compactã [a-z], unde prin cratimã se înþelege o serie de caractere consecutive.
Sã presupunem cã doriþi sã specificaþi º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 diferit de un caracter scris cu minuscule.
Pentru a specifica faptul cã o expresie regulatã se poate repeta, expresia regulat va fi urmatã de o pereche de paranteze acolade, care includ limitele superioarã ºi

153

inferioarã ale repetiþiei. De exemplu, expresia regulatã [aeiou] {1,4} corespunde unui ºir care este compus din 1-4 vocale. Pentru a specifica repetarea mai multor pãrþi ale unei expresii regulate, includeþi pãrþile respective între paranteze. 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".
Unele valori care se repetã sunt atât de frecvent folosite, încât au abrevieri:
<tabel>
*Abreviere
*Semnificaþie

*+
*{1, n}, unde n este un numãr arbitrar de mare
**
*{0, n}, unde n este un numãr arbitrar de mare
*?
*{0,1}
</tabel>

Sã presupunem cã doriþi sã reprezentaþi o înmulþire. Dacã folosiþi caractere minuscule pentru operanzi, puteþi obþine ceva de genul [a-z]*[a-z]. 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: [a-z]\*[a-z].
Pentru a specifica faptul cã o expresie regulatã corespunde numai unui sub-ºir care include caracterul iniþial al unui ºir subiect, 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-ºir care include caracterul final al unui ºir subiect, 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. Expresia regulatã ^[sml]at$ corespunde sub-ºirurilor "sat", "mat" sau "lat" numai dacã ºirul subiect este identic cu unul dintre aceste sub-ºiruri.

<Sugestie>
Expresiile regulate includ ºi alte instrumente în afara celor descrise pânã acum, instru­mente al cãror numãr este prea mare pentru a putea fi explicate într-un singur capitol. Nici mãcar în manualul PHP pe suport electronic nu existã o descriere completã a expresiilor regulate. Dacã aveþi acces la paginile de manual instalate cu PHP, puteþi citi o descriere completã a expresiilor regulate acceptate de PHP, care sunt compatibile cu standardul POSIX 1003.2. Standardul POSIX este un document costisitor, protejat prin legislaþia drepturilor de autor. Dacã nu puteþi obþine accesul la paginile de manual PHP sau la standardul POSIX, puteþi gãsi un îndrumar util privind expresiile regulate, scris de Dario F. Gomes, la adresa http://www.phpbuilder.com.</sugestie>

<titlu>Utilizarea expresiilor regulate</titlu>
PHP include numeroase funcþii care lucreazã cu expresii regulate. Tabelul 9-9 descrie aceste funcþii. Sub-secþiunea de faþã explicã funcþia ereg(); pentru informaþii privind celelalte funcþii, consultaþi manualul PHP.

154

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 simplu:

$model = „[sml]at”;
$subiect = „La noi in sat”;
$rezultat = ereg($model, $subiect);

Variabila $rezultat primeºte valoarea true, deoarece ºirul subiect conþine sub-ºirul "sat", care corespunde expresiei regulate.
Forma mai complexã a funcþiei ereg() include un al treilea argument, un tablou care primeºte sub-ºiruri ce corespund porþiunilor scrise între paranteze ale modelului. Proiectul aferent capitolului curent prezintã modul de utilizare a acestei forme a funcþiei ereg(), pe care o foloseºte pentru a determina dacã un ºir conþine o adresã de e-mail corect formatã.

<tabel 9-9 Funcþii PHP pentru expresii regulate>
*Funcþie
*Descriere

*ereg
*Executã o identificare cu o expresie regulatã

*ereg_replace
*Înlocuieºte un sub-ºir care corespunde unei expresii regulate

*eregi
*Executã o identificare cu o expresie regulatã insensibilã la diferenþa între majuscule ºi minuscule

*eregi_replace
*Înlocuieºte un sub-ºir care corespunde unei expresii regulate insensibile la diferenþa între majuscule ºi minuscule

*split
*Divide un ºir într-un tablou folosind o expresie regulatã

*spliti
*Divide un ºir într-un tablou folosind o expresie regulatã (insensibilã la diferenþa între majuscule ºi minuscule)

*sql_regcase
*Creeazã o expresie regulatã insensibilã la diferenþa între majuscule ºi minuscule dintr-un ºir care conþine o expresie regulatã.
</tabel 9-9>

<Sfatul specialistului >
Întrebare: Acest capitol explicã modul de generare a unor date de ieºire formatate. Existã vreo modalitate simplã de baleiere a datelor de intrare formatate?
Rãspuns: Funcþia PHP sscanf (), adãugatã în versiunea PHP 4.01, este complementara funcþiei printf (). Dacã funcþia printf () genereazã date de ieºire formatate, funcþia sscanf () citeºte un ºir, îl interpreteazã prin referirea la un ºir de formatare ºi stabileºte valorile variabilelor specificate în funcþie de conþinutul ºirului.
Sã luãm în considerare urmãtorul exemplu:
$subiect = "01,31,2005";
$n = sscanf($subiect, "%d,%d,%d", &$luna, &$zi, &$an);

155

echo "<BR>Au fost gãsite $n valori:";
echo "<BR>luna=$luna";
echo "<BR>zi=$zi";
echo "<BR>an=$an";

Datele de ieºire ale acestui exemplu sunt:

Au fost gãsite 3 valori:
luna=1
zi=31
an=2005
Pentru mai multe informaþii privind funcþia sscanf (), consultaþi manualul PHP. </Sfatul specialistului >

<Test „la minut">
• Ce funcþie PHP executã cãutarea sensibilã la diferenþa între majuscule ºi minuscule a unui ºir subiect al unui sub-ºir dat, examinând un numãr maxim dat de caractere?
• Ce funcþie PHP extrage un sub-ºir al unui ºir subiect, în funcþie de poziþia iniþialã ºi de lungimea sub-ºirului?
• Scrieþi o expresie regulatã care corespunde numai sub-ºirurilor "jos", "ros" ºi "cos" care apar la începutul unui ºir. </Test „la minut">

<titlu>Proiect 9-1: O rutinã de identificare a echivalenþelor cu expresii regulate</titlu>

În cadrul acestui proiect, veþi construi o paginã care vã permite sã intro­duceþi un ºir ºi o expresie regulatã, precum ºi sã cãutaþi în ºirul respectiv un sub-ºir care corespunde expresiei regulate. Puteþi folosi acest proiect pentru a vã îmbunãtãþi cunoºtinþele în materie de expresii regulate.

<titlu>Scopurile proiectului</titlu>
• Prezentarea modului de utilizare a funcþiei 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. Plasaþi urmãtorul script PHP într-un fiºier denumit p-9-1 .php ºi încãrcaþi acest fiºier în serverul dumneavoastrã PHP:

<?php
echo "<BR><B>sir:</B>&nbsp;$sir";
echo "<BR><B> expresie regulata:</B>&nbsp;$model";
if (get_magic_quotes_gpc())

<notã>
Rãspunsuri la test:
• strncmp()
• substr()
• ^[jrc]os
</notã>

156

{
echo "<BR><BR>";
echo "<BR>Eliminarea ghilimelelor magice....";
$sir = stripslashes($sir);
$model = stripslashes($model);
echo "<BR><B>sir:</B>&nbsp;$sir";
echo "<BR><B>expresie regulata:</B>&nbsp;$model";
}
$gasit = ereg($model, $sir, $echivalente);
echo "<BR><BR>";
if ($gasit)
{
echo "<BR><B>valabil:</B>&nbsp;true";
echo "<BR><BR>";
echo "<BR><B>Componente:&nbsp</B>";
for ($i = 0; $i < count($echivalente); $i++)
{
echo "<BR>$ echivalente [$i]";
}
}
else
echo "<BR><B>valabil:</B>&nbsp;false";
?>

2. Plasaþi urmãtorul text HTMLîntr-un fiºier denumit p-9-1 .html ºi încãrcaþi acest fiºier în serverul dumneavoastrã, inserându-l în acelaºi catalog ca ºi fiºierul 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-zA-Z0-9-]+)@([_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*)$”>
<BR><BR>
<BR>
<INPUT TYPE=”SUBMIT”>
</FONT>
</FORM>
</BODY>
</HTML>

3. Alocaþi un timp studiului scriptului HTML. Observaþi apelul la funcþia get_magic_quotes_gpc().| Aceastã funcþie returneazã o valoare corespunzãtoare opþiunii PHP magic_quotes_gpc, configuratã de administratorul de sistem PHP. Dacã aceastã opþiune este activatã, PHP,, adaugã automat caractere backslash la variabilele din formular, astfel încât valorile lor: poatã fi folosite în contexte care impun protecþia caracterelor speciale. Aceastã carac­teristicã nu este utilã la introducerea, vizualizarea ºi utilizarea unei expresii regulate.

157

Deci, dacã opþiunea este activatã, scriptul foloseºte funcþia stripslashes() pentru a elimina toate caracterele slash nedorite adãugate în mod automat de PHP. Pentru a vedea de ce este necesar acest lucru, puteþi elimina instrucþiunea if ºi corpul sãu din script ºi apoi încercaþi sã rulaþi scriptul. Dacã opþiunea magic_quotes_gpc este activatã în versiunea limbajului PHP instalatã în sistemul dumneavoastrã, scriptul nu va funcþiona în mod corespunzãtor.
4. Alocaþi un timp studiului paginii HTML. Acordaþi o atenþie specialã expresiei regulate specificate ca valoare prestabilitã a casetei cu text denumite model. Aceastã expresie regulatã aproximeazã forma unei adrese de e-mail. Cu toate acestea, nu este o reprezentare perfectã. Cãutarea expresiei regulate perfecte pentru reprezentarea adreselor corecte de e-mail este asemãnãtoare cu expediþiile medievale întreprinse pentru gãsirea Sfântului Graal*. Puteþi gãsi ºi alte potenþiale expresii regulate la adresa http:// www.phpbuilder.com ºi în manualul PHP adnotat.
<ecran>
Project 9-2: Regular Expression Tester
<câmpuri>
String:
Regular Expression:
^([_a-zA-Z0-9-]+)@([_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*)$
</câmpuri>
<buton> Submit Query </buton>
</ecran>

5. Orientaþi un browser Web spre adresa URL a fiºierului HTML încãrcat anterior. Ecranul browserului trebuie sã fie asemãnãtor celui prezentat în ilustraþia urmãtoare. Introduceþi o valoare a ºirului ºi, dacã doriþi, înlocuiþi valoarea expresiei regulate, dupã care executaþi clic pe butonul „Trimite interogarea".
6. La execuþia scriptului, acesta încearcã sã stabileascã o echivalenþã între expresia regulatã ºi un sub-ºir al ºirului ºi afiºeazã rezultatul. Un rezultat caracteristic este prezentat alãturat.

<ecran>

string: bill@osborne.com
regular expression: ^([_a-zA-Z0-9-]+)@([a-zA-Z0-9-]+(.[a-zA-
Z0-9-]+)*)$

Stripping magic quotes....
string: bill@osborne.com
regular expression: ^([_a-zA-Z0-9-]+)@([a-zA-Z0-9-]+(.[a-zA-
Z0-9-]+)*)$

valid: true

Components:
bill@osborne.com
bill
osborne.com
.corn
</ecran>

<notã>
In original Holy Grail (Sfântul Graal) - în legendele anglo-saxone, un potir folosit de lisus la Cina cea de Tainã ºi în care losif din Arimateea a cules ultimele picãturi din sângele lui lisus rãstignit pe Cruce; folosit frecvent ca simbol al puritãþii creºtine sau ca rãsplatã a acesteia. - N.T. </notã>

158

<Test de evaluare>
1. Scrieþi un ºir de formatare care specificã o valoare ºir aliniatã la stânga, care trebuie sã ocupe 24 de spaþii, urmatã de o valoare de tip double aliniatã la stânga, cu douã cifre zecimale.
2. Scrieti o secvenþã escape care reprezintã caracterul a cãrui valoare ASCII este 45 în octal.
3. Scrieþi un apel de funcþie ºi o atribuire care stocheazã în variabila $r valoarea variabilei $s ºi care eliminã caracterele de tip spaþiu alb de la început ºi de la sfârºit.
4. Scrieþi un apel de funcþie care returneazã un ºir asemãnãtor cu $s, dar ale cãrui n caractere, numãrate de la poziþia i, sunt înlocuite prin ºirul $r.
5. Scrieþi o expresie regulatã care corespunde numai sub-ºirurilor "axb", "ayb" ºi "azb" care apar la sfârºitul unui ºir subiect.
</Test de evaluare>





Visits: 552
   
 Top


Advertise on our site! Click here

 powered by Peperoni.de Users online right now: 20126   Help/FAQ   Terms   Imprint