You are on page 1of 12

Copyright Link group

Napredni stringovi i paterni





U prethodnoj lekciji govorili smo o stringovima. Tada smo nauili osnovne operacije koje
su nam potrebne za proizvodnju bilo kakve web aplikacije. U ovoj lekciji, produbiemo ta
znanja i dopuniti ih novim.

Poeemo sa interpolacijom promenljivih.

PHP ima jednu veoma dobru osobinu, da je u stanju da parsira string tako da
promenljive, koje se u njemu nalaze, imaju razliit tretman od samog teksta. Mi smo u
proloj lekciji obradili funkciju printf, koja omoguava formatiranje eme, po kojoj e biti
tretirani parametri funkcije printf("moja promenljiva %d", $x);

Ali, ovo smo mogli uraditi i na drugi nain:

printf("moja promenljiva $x");


odnosno:

echo "moja promenljiva $x";


Rezultat e, u oba sluaja, biti: moja promenljiva 2 (Dva je u primeru proizvoljan broj.
Bie, naravno, emitovana vrednost promenljive $x). PHP prilikom ovog postupka nije
svemoan. I treba paziti da promenljive, koje elimo da tretiramo kao promenljive, ne
izgube kontekst.

Pogledajmo sledei primer:

echo "$a bcd";


Promenljiva $a e biti regularno emitovana, jer je razdvojena od ostatka sadraja
stringa. Ali u sluaju da je linija izgleda ovako:

echo "$abcd";


Nee biti emitovana ni promenljiva $a, ni ostatak teksta, jer e interpreter traiti
promenljivu pod nazivom $abcd.

Ukoliko elite da implementirate string tako da promenljiva i ostatak stringa budu
spojeni, moete upotrebiti vitiaste zagrade kao separatore:

echo "{$a}bcd";


ili konkatinacione operatore:

echo $a ."bcd";


Copyright Link group
U oba sluaja, rezultat e biti isti 2bcd (ponavljamo da je vrednost 2 hipotetika. Ona
moe biti bilo koja vrednost promenljive $a).

Ponekad emo poeleti da postignemo i obrnut efekat. eleemo da promenljiva ne bude
tretirana kao promenljiva, nego kao tekst (na primer, elimo da nam tekst stringa bude
$a bcd). Da bismo ovo uradili, obratiemo malo panju na navodnike u PHP-u.

Videli smo da je u PHP-u mogue praviti string na dva naina: sa jednostrukim ili
dvostrukim navodnicima. Ovo emo obino uraditi ako elimo da se u naem tekstu vide
i navodnici. Obino je svejedno u koje emo navodnike smestiti string, sve dok se ne
poklapaju sa navodnicima koje elimo da prikaemo unutar tog stringa:

echo '"moj" tekst';


Ovaj primer e emitovati na stranu sledei rezultat: "moj" tekst.
I obrnuto. Sledei primer:

echo "'moj' tekst";


emitovae:

'moj' tekst


Ali e zato:

echo ""moj" tekst";


prijaviti greku.

Naravno, uvek moete staviti navodnik iza escape karaktera i tako ga emitovati: \"

Vratimo se sada na interpolaciju promenljivih. Tu, takoe postoji razlika kada su tipovi
navodnika u pitanju. Videli smo da dvostruki navodnici dozvoljavaju parsiranje
promenljive. Sa druge strane, jednostruki navodnici ne parsiraju ni promenljive, kao ni
specijalne karaktere, pa e sve to u njih stavite, biti tako i emitovano:

echo '$a bcd';


emituje:

$a bcd

echo '\n'; emituje \n...


Herodoc sintaksa

Iako specijalni karakteri i html oznake omoguavaju veliku slobodu prilikom emitovanja
teksta (moete napraviti formu kakvu god elite), ovo esto i nije najjednostavniji nain
da se tekst formatira. Naroito ako elite da kopirate neku ve gotovu tekstualnu formu.
U ovom sluaju, mnogo je praktinije upotrebiti herodoc string. Uz pomo ove sintakse,
moete formatirati ak i najkompleksnije stringove. Upotrebljava se na sledei nain:

Copyright Link group
Poetak stringa obeleava se se oznakom <<< kojoj sledi identifikator, to moe biti bilo
koji naziv, koji ne odstupa od standardnih pravila za imenovanje promenljivih. Obino
se, zbog preglednosti, identifikator pie velikim slovima. Nakon identifikatora obavezan
je novi red, odakle moe poeti i sam tekst.

Kraj teksta se oznaava takoe identifikatorom, kome mora prethoditi novi red, a sledi
oznaka ;.

<<<MOJTEKST
Naslov<br>
Sadrzaj...
MOJTEKST;


Ovako formatiran sadraj moete smestiti u promenljivu ili poslati direktno na izlaz:

$a=<<<MOJTEKST
Naslov<br>
Sadrzaj...
MOJTEKST;

echo<<<MOJTEKST
Naslov<br>
Sadrzaj...
MOJTEKST;


Herodoc stringovi su veoma moni alati. Pokuajte da otvorite izvorni kod neke web
strane i da ga kopirate u svoj herodoc string. Videete da e kompletan kod biti obraen
bez problema ili greaka.

Obzirom da omoguava pamenje velike koliine teksta, nemojte zaboraviti da postoji
memorijski limit koji je PHP-u dozvoljen da koristi za skriptiranje. U sluaju da preterate
sa koliinom, PHP jednostavno nee biti u stanju da obradi Va string i doi e do greke.


Duina stringa

Jedna od najee korienih funkcija nad stringovima je funkcija kojom se odreuje
duina stringa. Ova funkcija se zove strlen.

Da bismo upotrebili ovu funkciju (koja je inae vrlo jednostavna), pogledaemo prvo od
ega se uopte sastoji string. Npr, tekst: moj string, sastoji se od karaktera. A svaki od
tih karaktera je, zapravo, jedan bajt. To znai da je na string u stvari, nita drugo, nego
jedan niz bajtova. Da li to znai da bismo, kada bismo se obratili nekom stringu kroz
njegov niz, dobili kao lanove tog niza karaktere naeg stringa? Da.

Na primer:

$a="moj tekst";
echo $a[2];


posle sledeeg koda, na ekranu e biti ispisan karakter j, to je drugi (ako se koristi zero
based indeksiranje) karakter u naem stringu.


Copyright Link group
Obzirom da smo ustanovili da je string jedan niz karaktera, funkciju strlen moemo
tretirati kao funkciju koja broji lanove tog niza.

echo strlen("moj string");


Ono to je vano da znate prilikom korienja ove funkcije, jeste da, za razliku od nekih
drugih jezika, ona nema zero terminated mehanizam i kada naie na prazan karakter,
ona ne prekida automatski brojanje, nego nastavlja, sve dok postoje bilo kakve
vrednosti za karaktere u promenljivoj koju broji.
To u praksi znai da e ovaj primer:

$a=" ";
echo strlen($a);


koji bi u nekom drugom jeziku (sa drugom funkcijom) dao rezultat 0, ovde dati rezultat
5, jer se string sastoji od pet praznih karaktera.

Evo primera kako da se reimo spejsova u nekom tekstu:

$s = "moj tekst";
for ($i = 0; $i < strlen ($s); $i++) {
if($s[$i]!=" ")
echo $s[$i];
}


Poreenje stringova

Osnovni nain za poreenje stringova je, uz pomo operatora poreenja.

echo "moj string"=="moj string";


Ovaj nain je dobar, ukoliko rukujemo sa hard kodiranim vrednostima. Ali, pogledajte
sada sledei primer:

echo "1moj string"==1;


Ovaj primer, kao i malopreanji, daje taan rezultat. Iako naizgled, dve poreene
strane nemaju nikakve bliskosti.

PHP je prvo pregledao operande i video da se radi o poreenju stringa sa int-om, to je
nemogue. Zato je implicitno konvertovao levi operand u int, to je vrednost levog
operanda svelo na 1 (jedini broj koji postoji u stringu), to je konano dovelo do
poreenja 1 i 1, koje, naravno, daje taan rezultat. Moda, na prvi pogled, ne deluje kao
da bi do ovakve greke moglo doi, ali, ne zaboravite da u programima, na ovakva
poreenja obino dolaze dinamiki kreirane vrednosti (na primer $a==$b).

Poreenje stringova moete izvriti i na drugi nain. Funkcijama strcmp i strcasecmp.
Ove funkcije, kao parametre, primaju dva stringa koja se porede, a kao rezultat vraaju
nulu, ako su stringovi identini ili broj razliitih karaktera.

echo strcmp("moj string","moj string");


Copyright Link group
Primer emituje vrednost 0.

Razlika izmeu strcmp i strcasecmp je u tome to funkcija strcasecmp nije osetljiva na
velika i mala slova.

echo strcmp("Moj string","moj string"); // rezultat je 1
echo strcasecmp("Moj string","moj string"); // rezultat je 0


Pretraga stringa

Postoji mogunost traenja odreenog karaktera ili sekvence karaktera unutar samog
stringa. Za ovo se koristi funkcija strpos.
Ova funkcija prihvata, kao parametre, inicijalni string i sekvencu koju traimo, a kao
rezultat vraa poetnu poziciju (indeks) traene sekvence. Odnosno, ne vraa nita,
ukoliko traena sekvenca ne postoji.

echo strpos("moj string","str");


Ovaj primer vraa vrednost etiri.
Takoe, ova funkcija moe prihvatiti i trei, opcioni parametar, koji oznaava mesto od
koga e pojava traenog karaktera biti uzeta u obzir.

echo strpos("moj stringstr","str",5);


U primeru se ne uzimaju u obzir pojave traenog karaktera pre petog karaktera stringa.
Znai da prvo pojavljivanje nee biti uzeto u obzir. Rezultat funkcije e biti deset, jer se
prvo sledee pojavljivanje dogaa na desetom karakteru stringa.


Izmena stringa

U PHP-u je mogue jedan deo stringa zameniti drugim. Ovako neto moete uvek uraditi
uz pomo do sada pomenutih funkcija, ali i korienjem funkcija posebno pisanih za tu
namenu: str_replace i str_ireplace (ista funkcija neosetljiva na velika i mala slova):

echo str_replace("moj", "tvoj", "moj tekst");


funkcija str_replace prihvata tri (ili etiri) parametra. Prvi parametar je traeni deo
stringa, drugi je deo koji e biti ubaen umesto traenog stringa, a trei je string na
kome se vri intervencija. etvrti, opcioni parametar, omoguava da se u neku
promenljivu smesti broj pronaenih sluajeva traenog stringa.

$a=0;
echo str_replace("moj", "tvoj", "moj tekst",$a);
echo $a;

Ovaj primer dae vrednost jedan, poto se re moj pojavljuje samo jednom u stringu.
Na ovaj nain, moete zameniti i vie sluajeva u jednom stringu, uz pomo nizova:

$cilj = array("ja ucim", "ti ucis", "on uci");
$zamena = array("mi ucimo","vi ucite","oni uce");
echo str_replace($cilj, $zamena, "ja ucim php",$a);


Copyright Link group
Ovaj primer promenie tekst u: "mi ucimo php".

Nekada ete eleti da izmenite string na odreenoj poziciji (indeksu). Na primer, ako ste
gradili neku listu na osnovu nekih podataka koje ste dobijali sekvencijalno. Lako se moe
desiti da ti podaci zavre u sledeem obliku:

1,2,3,4,5,

jer, obzirom da listu kreirate dinamiki, ne znate koji je njen poslednji lan, pa ostanete
sa jednim zarezom (ili nekim drugim separatorom) vika. U tom sluaju,
substr_replace funkcija je odlino reenje:

$x = "1,2,3,4,5,";
echo substr_replace($x, "", strlen($x)-1);


Funkcija kao parametre prihvata string, string koji ete umetnuti kao zamenu i poziciju
odakle e poeti zamena. Obzirom da duinu stringa ne znamo (lista moe biti od 1-5 ali
moe biti i 1-1000), za poziciju uzimamo duinu umanjenu za jedan (znai, poslednji
element).


Izdvajanje dela stringa

Moete izdvojiti deo stringa sa odreene pozicije funkcijom substr. Ova funkcija prima
tri parametra. String, poziciju poetka dela koji se izdvaja i opciono, broj karaktera koji
se izdvajaju.

$x="http://www.google.com";
echo substr($x,7);


Primer e emitovati tekst nakon sedmog karaktera. Rezultat je www.google.com. Kada
se ne unese trei parametar, preuzima se kompletan string, od poetne pozicije. Ukoliko
se unese trei parametar, preuzima se onoliko karaktera koliko je naznaeno u treem
parametru:

$x="http://www.google.com";
echo substr($x,7,3);


Rezultat primera je www.


Formatiranje stringa

Formatiranje stringova smo ve pomenuli kroz funkciju number_format. Ova funkcija
omoguava raznovrsnost prilikom ispisa brojeva (pre svega decimalne notacije):

echo number_format(30.4000,3);


Prvi parametar ove funkcije je sam broj. Drugi parametar je maksimalan broj prikazanih
decimala. Izlaz ovog koda je: 30.400.

Ova funkcija moe prihvatiti i dva opciona parametra (iskljuivo oba parametra), koja
predstavljaju karakter, koji e odvajati decimale broja i karakter koji e odvajati hiljade.

Copyright Link group

echo number_format(30000,3,".",",");


Izlaz je:

30,000.000


Neke formate moete deklarisati i putem identifikacije lokalizacije, funkcijom setlocale.
Za to Vam je potreban naziv grupe za formatiranje i naziv lokalizacije. Sledei primer
formatirae sve zapise grupe LC_MONETARY, po lokalizaciji en_US:

setlocale(LC_MONETARY, "en_US"); ili setlocale(LC_MONETARY, "ja_JP");


Generiko formatiranje

Sa ovim nainom formatiranja smo ve upoznati kroz prethodne lekcije. Funkcije su
printf, sprintf i fprintf (razlike ove tri funkciju su iskljuivo u tipu izlaza. prva ima
standardan izlaz (strana ili konzola), sprintf ima moe vratiti rezultat, a fprintf ima izlaz
u fajl).

Sintaksa formatiranja je sledea:

printf("Moj broj: %d", 100);


Prvi parametar ove funkcije (string moj broj: %d) je ono to e otii na izlaz, dok je
drugi (pa i svi ostali) parametar, vrednost koja e zameniti identifikator u stringu (%d).
U ovom sluaju, identifikator je d, to znai da e na izlazu biti decimalna vrednost, ali
mogli smo upotrebiti i neke druge identifikatore. Na primer: %b, bi dao binarni izlaz:

printf("Moj broj: %b", 10);


Prilikom formatiranja stringa na ovaj nain, niste ogranieni samo na jedan identifikator.

printf("Moj decimalni broj: %d, moj binarni broj: %b, moj broj sa
pokretnim zarezom: %f", 10,10,10);


Mogue je koristiti sledee vrednosti za formatiranje stringa:

b binarna reprezentacija
c prikazuje karakter koji reprezentuje ascii brojnu vrednost
d decimalna reprezentacija
e prevodi u broj sa eksponentom (printf("%e", 10); daje izlaz 1.000000e+1)
u neoznaena reprezentacija
f reprezentuje broj kao broj sa pokretnim zarezom prema zadatoj lokalizaciji
printf ("%3.2f", $broj);
F reprezentuje broj kao broj sa pokretnim zarezom bez zadate lokalizacije
o oktalna reprezentacija broja
s string (printf("%s", "moj tekst");)
x heksadecimalna reprezentacija sa malim slovima (ffffff)
X - heksadecimalna reprezentacija sa velikim slovima (FFFFFF)


Copyright Link group
Regularni izrazi

Kada, jednostavno, nemate uslova da reite neku operaciju na stringu standardnim
putem (kod je na primer, prekompleksan), onda moete se posluiti i regularnim
izrazima.

Regularni izrazi su setovi pravila, po kojima se neki string pretrauje.

Na primer, ako bismo eleli da budemo sigurni da je neki string zapisan u formi e-mail-a,
mogli bismo da kaemo da za njega postoji nekoliko pravila:

Mora imati neki tekst na poetku, bez specijalnih karaktera
Mora imati karakter @ nakon poetnog teksta
Mora imati tekst nakon oznake @
Zatim, mora imati taku i tekst nakon take


Ovaj opis odgovara veini e-mail-ova.

Poto iz opisa zakljuujemo da znamo neke osobenosti, ali ne i koji je tano sadraj
celog stringa, ovo je pravo mesto za upotrebu regularnog izraza.

Da bi neki tekst bio tretiran kao regularni izraz, potrebno je da mu na poetak i kraj
stavimo delimitere. Ovi delimiteri mogu biti bilo koji karakter, ali se u praksi najee u
tu svrhu koristi kosa crta / .

/moj regularni izraz/


Sve unutar delimitera predstavlja sadraj regularnog izraza, odnosno, obrazac za
poreenje.

Funkcija koja poredi regularni izraz sa stringom naziva se preg_match. Ova funkcija
prihvata (u osnovi) dva parametra, regularni izraz i string koji se poredi, a vraa kao
rezultat 1, ako se tekst poklapa sa izrazom i 0, ako se ne poklapa. Zapravo, funkcija
vraa broj Sledei primer vraa rezultat 1.

echo preg_match("/mojstring/","mojstring");


Ovako banalno poreenje mogli smo izvriti i standardnim funkcijama, dok regularne
izraze obino koristimo kada ne moemo da reimo poreenje ni na jedan drugi nain.
Ne samo zato to su komplikovani za upotrebu, ve i zato to po brzini zaostaju za
standardnim funkcijama.

Da bi regularni izraz imao neku funkciju, potrebno je uvesti mu jos neke elemente osim
delimitera.


Meta karakteri

Meta karakteri su delovi regularnog izraza, koji na neki nain idenitifikuju odreeni deo
teksta.

. - Oznaava bilo koji karakter u tekstu
echo preg_match("/moj.tring/","mojKtring"); //vraa 1


Copyright Link group
- Oznaava poetak stringa

$ - Oznaava kraj stringa

\s - Oznaava spejs
echo preg_match("/moj\sstring/","moj string"); //vraa 1

\d Oznaava bilo koji broj
echo preg_match("/broj \d/","broj 5); //vraa 1

\w Oznaava re u stringu
echo preg_match("/moj \w/","moj string"); //vraca 1



Mogue je grupisanje vie uslova za odreeni deo teksta, uz pomo uglastih zagrada:

echo preg_match("/a[bcd]e/","abe");


U prethodnom primeru, dozvoljena je jedna od tri alternative (b, c ili d) izmeu
karaktera a i e.

Dozvoljene su i kombinacije odreenih opsega karaktera sa metakarakterima. Sledei
primer podrazumeva poetno slovo a, zatim slova b ili c, kojima sleduje broj.

echo preg_match("/a[bc\d]/","ab2"); //vraca 1


Kvantifikatori

Kvantifikatori odreuju koliko e se puta odreeni uslov ponoviti u regularnom izrazu.

- Karakter moe da se pojavi ni jednom ili vie puta
echo preg_match("/moj s*tring/","moj sssstring"); // vraca 1
echo preg_match("/moj s*tring/","moj string"); // vraca 1

+ Karakter moe da se pojavi jednom ili vie puta
echo preg_match("/moj s+tring/","moj sssstring"); // vraca 1
echo preg_match("/moj s+tring/","moj sssstring"); // vraca 1
echo preg_match("/moj s+tring/","moj tring"); // vraca 0

? Karakter moe da se pojavi jednom ili ni jednom na zadatoj lokaciji
echo preg_match("/moj s?tring/","moj tring"); // vraca 1
echo preg_match("/moj s?tring/","moj string"); // vraca 1

{n,m} Karakter mora da se pojavi minimum n puta a maksimum m puta.
echo preg_match("/moj s{1,3}tring/","moj ssstring"); // vraca 1
echo preg_match("/moj s{1,3}tring/","moj sssstring"); // vraca 0


Regularni izrazi unutar regularnih izraza

Mogue je tretirati i ceo jedan izraz kao zasebnu jedinicu (karakter). Na primer, ako
bismo eleli da upotrebimo kvantifikator nad nekim izrazom, a ne samo karakterom.

Oznaka za regularni izraz unutar regularnog izraza je otvorena i zatvorena mala zagrada.

Copyright Link group

echo preg_match("/moj (ab.) string/","moj abc string"); //vraca 1


U primeru, rekli smo da elimo da na obrazac mora da poinje reju moj, zatim mora
uslediti prazan prostor, a zatim moraju uslediti tri karaktera ab i bilo koji karakter. Na
kraju, izraz smo zavrili sa reju string, kojom prethodi jedan prazan prostor.

Ovo smo mogli uraditi i bez malih zagrada, ali, ta ako elimo da na kompletan obrazac
(ab.) primenimo neki kvantifikator. Na primer, da mora da se ponovi jednom ili vie puta
(+), mogli bismo, jednostavno, izmeniti izraz:

echo preg_match("/moj (ab.)+ string/","moj abcabdabe string"); //
vraca 1


Sada kada ste upoznali strukturu regularnih izraza, moete ih koristiti za proveru
stringova (to ste ve nauili) ili direktnu zamenu stringova:

$tekst = "[mojTag]Dobro dosli[/mojTag]";
$regEx = "@\[mojTag\](.*?)\[/mojTag\]@i";
$noviTekst = "<b>$1</b>";
echo preg_replace($regEx, $noviTekst, $tekst);


U prethodnom primeru vidimo da je mogue ak izvriti i parametrizaciju u regularnim
izrazima. U ovom sluaju, vrednost $1 predstavlja vrednost prvog sluaja poklapanja.

Regularni izrazi su posebna dimenzija programiranja, i nemojte se mnogo optereivati
njima. Iako su veoma efikasni, retko da e Vam ustrebati uzorak regularnog izraza koji
ve ne postoji. Tako da ete, vei deo rada na regularnim izrazima, provesti u traenju
odgovarajueg uzorka, nego sopstvene izgradnje istog.


Veba 1

Problem:

U aplikaciju ulazi sledea promenljiva:

$string = "myMail@mail.ml";


Potrebno je napraviti regularni izraz kojim e se proveriti da li je vrednost promenljive
mail adresa.


Reenje:

<?php
$string = "myMail@mail.ml";
$pattern = "/^[a-zA-Z0-9]+\@[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/";
echo preg_match($pattern,$string);
?>



Copyright Link group
Veba 2

Problem:

Data je sledea promenljiva:

$string = "http://myPage.php?id=25&cat=18&user=34";


Potrebno je preuzeti sve parametre i smestiti ih u asocijativni niz.


Reenje:

<?php
$string = "http://myPage.php?id=25&cat=18&user=34";
$pars = explode("?",$string);
$pars = explode("&",$pars[1]);
$parsedPars=array();
for($i=0;$i<sizeof($pars);$i++)
{

$currentParam = explode("=",$pars[$i]);
$parsedPars[$currentParam[0]]=$currentParam[1];
}
print_r($parsedPars);
?>


Veba 3

Problem:

Dat je sledei url string:

$string = "http://myDomain/home/index.php?id=25&cat=18&user=34";


Potrebno je izolovati samo domen sa folderima i nazivom strane
(myDomain/home/index.php)


Reenje:

<?php
$string = "http://myDomain/home/index.php?id=25&cat=18&user=34";
$pars = preg_replace("/http:\/\//","",$string);
$pars = preg_replace("/\?[a-zA-Z0-9=&]+/","",$pars);
print_r($pars);
?>


Najvanije iz lekcije:

1. Postoji nekoliko naina za zapis stringova i mnotvo funkcija za rukovanje njima
2. PHP je u stanju da parsira string tako to e iz njega izvui komponente bitne za
izvrenje programa (promenljive)

Copyright Link group
3. Razlika izmeu dvostrukih i jednostrukih navodnika je izmeu ostalog to
dvostruki navodnici dozvoljavaju parsiranje promenljivih unutar stringa a
jednostruki ne
4. Stringove je mogue formatirati po potrebi izlaza
5. Mogue je prebrojati karaktere stringa (funkcija strlen)
6. Mogue je promeniti odreeni deo stringa nekim drugim stringom (str_replace)
7. Mogue je izdvojiti odreeni tekst u nekom stringu (substr)

You might also like