Napredni Nizovi i Paterni

Embed Size (px)

DESCRIPTION

php

Citation preview

  • 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

  • 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 = "$1"; 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 = "[email protected]"; Potrebno je napraviti regularni izraz kojim e se proveriti da li je vrednost promenljive mail adresa. Reenje:

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

    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:

    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)