Home   FORUM   Toplista   HTML   CSS   JavaScript   PHP   DIZAJN   SEO   Mapa
KONTAKT
izuzetan[at]gmail.com






TOP LISTA SAJTOVA

Funkcija preg_replace

Prethodne dve funkcije koje smo razmatrali pronalaze ono što smo definisali u regularnom izrazu i ako nadju vraćaju to što nadju. Funkcija preg_replace radi drugačije, ona ono što pronadje zameni sa stringom koga takodje definišemo u toj funkciji. Evo prototipa:

mixed preg_replace (mixed $regularni_izraz, mixed $zamena, mixed $tekst, [int $ogranicenje])

Funkcija pronalazi $regularni_izraz u $tekst i kad nadje zamenjuje sa $zamena. Ako je zadato $ogranicenje, zamenjuje se samo toliki broj podudaranja koliki je broj u $ogranicenje. Ako $ogranicenje nije zadato ili je jednako -1, zamenjuju se sva podudaranja. Evo primera:

<?
$tekst = "aaa12345678 wwww 4356754754637823";
$rezultat = preg_replace("/[0-9]{8}/", "zzzz", $tekst, 2);
echo $rezultat;
?>

Rezultat:

aaazzzz wwww zzzz54637823

E sad $regularni_izraz može biti i niz. Primer sve objašnjava:

<?php
$tekst = "aaa bbb ccc dejan mala sasa bbb aaa";
$uzorak[0] = "/aaa/";
$uzorak[1] = "/ccc/";
$uzorak[2] = "/bbb/";
$zamena = "@@@";
echo preg_replace ($uzorak, $zamena, $tekst);
?>

Rezultat će biti:

@@@ @@@ @@@ dejan mala sasa @@@ @@@

Znači gde god funkcija nadje bilo koji od uzoraka u tekstu zameniće ga. Normalno da smo stavili za četvrti parametar na primer broj 2 onda bi rezultat bio:

@@@ @@@ ccc dejan mala sasa bbb aaa

Takodje i $zamena može biti niz. Ajde da vidimo:

<?php
$tekst = "aaa bbb ccc dejan mala sasa bbb aaa";
$uzorak[0] = "/aaa/";
$uzorak[1] = "/ccc/";
$uzorak[2] = "/bbb/";
$zamena[0] = "@@@";
$zamena[1] = "^^^";
$zamena[2] = "***";
echo preg_replace($uzorak, $zamena, $tekst);
?>

Rezultat je:

@@@ *** ^^^ dejan mala sasa *** @@@

Znači gde god se naidje na uzorak sa indeksom 0 zamenjuje se sa zamenom sa indeksom 0, a kad se naidje na uzorak u tekstu sa indeksom 1 zamenjuje se sa zamenom koja ima indeks 1, i tako dalje. E sad ako ima na primer više uzoraka od zamena, kad se istroše zamene posle toga se zamenjuje sa prazninom. A ako ima manje uzoraka od zamena onda se traže samo oni uzorci koji postoje i oni se zamenjuju.

I $tekst može biti niz. Evo kako to izgleda:

<?php
$tekst[0] = "aaa bbb ccc 1111111111";
$tekst[1] = "aaa bbb ccc";
$tekst[2] = "111111111 aaa bbb ccc";
$uzorak[0] = "/aaa/";
$uzorak[1] = "/ccc/";
$uzorak[2] = "/bbb/";
$zamena[0] = "@@@";
$zamena[1] = "^^^";
$zamena[2] = "***";
$a = preg_replace($uzorak, $zamena, $tekst);
for ($i=0; $i<3; $i++) echo $a[$i]."<br>";
?>

Rezultat je:

@@@ *** ^^^ 1111111111
@@@ *** ^^^
111111111 @@@ *** ^^^

Ovde nema potrebe da se objašnjava pošto je valjda sve jasno.

E sad parametar $zamena može imati odredjene varijacije još. Do sada smo funkcijom preg_replace tražili uzorak u tekstu i kad se nadje zameni se sa $zamena. Znači vraća se ceo tekst sa odredjenim izmenama. Medjutim postoji varijanta da se ne vrati ceo tekst (ali ako podesimo i može), već da se izvuku pronadjeni delovi teksta definisani uzorkom i da se poredjaju kako nam je volja i da se ubace znakovi po želji šta nam je volja, i kako nam je volja. Ovo ovako napisano možda deluje totalno nejasno ali primeri će sve razjasniti:

<?
$tekst = "se####der jru, rt@@@@dfrtg. Jkjt jdydy y&&&&hbwef";
$uzorak = "/(.{2})(####)(.{11})(@@@@)(.{19})(&&&&)(.{5})/";
$zamena = "$4$6$2";
$a1 = preg_replace($uzorak, $zamena, $tekst);
$zamena = "$4$3$6";
$a2 = preg_replace($uzorak, $zamena, $tekst);
$zamena = "${4}8888$3POSAO$6";
$a3 = preg_replace($uzorak, $zamena, $tekst);
echo $a1."<br>".$a2."<br>".$a3;
?>

Rezultat je:

@@@@&&&&####
@@@@der jru, rt&&&&
8888der jru, rtPOSAO&&&&

Ponekad je bitno znati unapred formu (pravilo) teksta u stringu $tekst. Šta to znači? Ne moramo znati tačno sve znakove teksta koji se mogu pojaviti, ali moramo znati odredjena pravila koliko znaka, kog oblika i u kom delu teksta će se znaci pojavljivati u stringu koga ispitujemo. Na primer svi znamo da se imena sajtova pišu u formi http://ime-sajta.com . E sad forma je sledeća, imamo uvek http:// na istom mestu sa istim znacima. Pa zatim ime sajta koje može imati na primer mala ili velika slova, tačku, srednju i donju crtu, itd. Pa zatim .com, ili .net koje su isto konstante itd. Znači domeni sajtova imaju svoju formu. U tom smislu za naredne stvari koje slede moramo znati formu stringa $tekst.

U našem konkretnom slučaju string $tekst je: "se####der jru, rt@@@@dfrtg. Jkjt jdydy y&&&&hbwef" . A formu stringa $tekst moramo pretočiti u regularan izraz i to tako da taj regularan izraz opisuje uvek validno eventualne sve varijacije stringa $tekst (ili bar koliko god je to moguće). Regularan izraz za naš konkretan $tekst bi pravili ovako: Imamo prvo "se" a na primer to može u nekim varijacijama teksta da bude kombinacija bilo koja moguća dva znaka. Ako je tako onda "se" možemo pretstaviti u reg. izrazu kao (.{2}). Zatim imamo "####" i recimo neka bude to uvek fiksno četri tarabe. To bi onda u reg. izrazu moglo da se zapiše kao (####). Krenimo tom logikom na dalje i biće:

der jru, rt => (.{11})
@@@@ => (@@@@)
dfrtg. Jkjt jdydy y => (.{19})
&&&& => (&&&&)
hbwef => (.{5})

Kad se svi ovi delovi regularnog izraza spoje dobićemo jedan regularan izraz koji potpuno opisuje našu tekst formu. On bi glasio:

$uzorak = "/(.{2})(####)(.{11})(@@@@)(.{19})(&&&&)(.{5})/"

Regularni izraz $uzorak se sastoji od nekoliko zagrada. Mada nije pravilo da mora da se sastoji samo od zagrada. Može se sastojati u nekim slučajevima i od zagrada i od još nekih znakova izvan zagrada. Medjutim u našem konkretnom slučaju šematski naš regularni izraz možemo pretstaviti:

$uzorak = "/()()()()()()/"

Obeležimo sad svaku od tih zagrada sa redom $1, $2, $3, $4, $5, $6, $7. Napomena je da $1, $2 i ostali, se odnose isključivo na zagrade (i ono što se nalazi u njima naravno) bez obzira što se reg. izraz uzorka kao što smo napomenuli može sastojati još od nekih znakova izvan zagrada.  Time smo dobili "reči" regularnog izraza. I sad ono što je ključno, te "reči" možemo kombinovati u parametru $zamena funkcije preg_replace kako nam je volja. Na primer mi smo koristili 3 kombinacije u primeru, ali naravno mogućnosti su neograničene. Na primer mogu da se reči ponavljaju, kombinuju više puta i to sve "reči" ili samo neke, odnosno možete pustiti mašti na volju.

E sad onako kako iskombinujemo "reči" u $uzorak tako će i funkcija preg_replace i vratiti. Konkretno u našem primeru je preg_replace vratila ono što se nalazi u $a1, $a2 i $a3.

Ako pogledamo u primeru videćemo da smo u jednom trenutku za zamenu napisali $zamena = "${4}8888$3POSAO$6". Kao što vidimo ne moramo samo pisati $1$2$3 itd. već izmednju njih možemo pisati slova, brojeve ili bilo koje druge znakove. Medjutim ako se piše broj onda mora stajati redni broj reči u vitičastim zagradama da funkcija ne bi pomešala. Na primer da smo napisali $48888, funkcija bi to protumačila kao 48 888 "reč". Reči mogu da idu od 0 do 99. Znači $0, $1, $2, $3, ..., $99. Kad je $0 onda se tako zamenjuju sve reči poredjane od najmanje do najveće. Znači u našem slučaju $0 je ekvivalentno kao da smo napisali $1$2$3$4$5$6$7.

Napomenuli smo da se regularni izraz ne mora "raslojiti" samo od zagrada, pa da to potkrepimo i primerom da bi sve bilo jasno:

<?php
$tekst = "April 15, 2003";
$uzorak = "/(\w+) (\d+), (\d+)/i";
$zamena = "${1}1,$3";
echo preg_replace($uzorak, $zamena, $tekst);
?>

Rezultat:

April1,2003

$uzork je ovako napravljen:

(\w+) - svi word znaci (a oni ne sadrže kao što znamo i razmaknicu). To drugim rečima znači da taj deo reg. izraza ide samo do razmaknice u tekstu, to jest obuhvata u ovoj varijanti teksta samo "April". Medjutim takodje reg. izraz govori da ne mora tu stajati uvek samo 5 word znaka već najmanje jedan znak i više jer figuriše i reg. znak +.  Znači tu može u nekim varijacijama teksta na primer stajati i R43Uurthfzt ili pak samo jedan word znak, ali ne ni jedan znak. Da je stajao reg izraz znak množenja onda bi obuhvatao i "ni jedan znak".

Zatim reg. izraz se sastoji od razmaknice i u nastavku (\d+). Kao što znamo "\d" zamenjuje sve brojeve, a pošto ima i reg. znak "+" u nastavku znači da tu može figurisati u raznim varijantama jedan ili neograničen broj brojeva.

Zatim zarez kao fiksni koga smo napisali samostalno. Ali mogli smo i u zagradi (\,), ali zbog konkrtnog objašnjenja da izvan zagrada može da stoje i još neki znaci (u konkretnom primeru su zarez i dve razmaknice), stavili smo zarez izvan zagrada. Kao što vidimo da bi smo stavili kao literal znak zarez u bilo kojoj zagradi reg. izraza, moramo staviti i kosu crtu ispred zareza jer zarez je sintaksa regularnih izraza unutar zagrada, a izvan zagrada nije sintaksa pa može stajati bez kose crte.

Zatim ide razmaknica opet, i na kraju opet deo reg. izraz za brojeve koji definiše jedan i više brojeva (\d+).

Zamenu smo definisali kao "${1}1,$3". Reč ${1} označava prvu zagradu u reg izrazu, a reg izraz sa prvom zagradom u našem konkretnom tekstu nalazi "April". Zatim ide "slobodan" literal znak 1 i zarez , i na kraju $3 koji označava treću zagradu koja definiše i pronalazi u tekstu string "2003". Sve ovo kad se spoji dobijamo rezultat April1,2003.

Poenta u ovom primeru je znači da i u $zamena mogu da stoje slobodno znaci, ili oni koji nam trebaju iz uzorka koje smo smestili izvan zagrada pa ne možemo da ih definišemo nekim $n izrazom, ili sasvim neki novi po našoj želji.

I na kraju treba dodati da su ovde korišćeni prostiji regularni izrazi jer je fokus bio na što boljem objašnjenju funkcije. Složenije primere reg. izraza i još neke stvari vezane za funkciju možete videti na LINK

Copyright © 2010 BUbaj. Powered By bubaj.com
PHP    PHP sintaksa    Fajl    Niz    String    Funkcija    Objektno programiranje    MySQL    Unos fajla    Datum    Forme    Sesija    Registracija