IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

13. diel - Funkcie pre prácu s reťazcami v PHP

V dnešnom PHP tutoriále si ukážeme PHP funkcie pre textové reťazce. :): D

Textové reťazce a UTF-8

Časť PHP funkcií pre prácu s reťazcami začína prefixom mb_. Je to z toho dôvodu, že tieto funkcie podporujú UTF-8 kódovanie (MB ako MultiByte). V kódovanie UTF-8 sa píše prevažná väčšina webov, pretože vie väčšinu znakov väčšiny národných abecied. Nie je teda problém na webe použiť češtinu, ďalej citovať niečo po rusky alebo používať špeciálne znaky ako alebo . Väčšina IDE (napr. NetBeans) tvoria projekty vždy ako UTF-8. Ak UTF-8 nepoužívate, stretnete sa časom s veľkými problémami, napr. Vtedy, keď budete chcieť použiť nejakú cudziu knižnicu. Jej autor totiž určite počíta s tým, že UTFko používate.

Akonáhle v aplikácii používame tieto funkcie, musíme často najprv nastaviť kódovanie, inak nebudú korektne fungovať v starších verziách PHP. Kódovanie stačí nastaviť len raz v každej požiadavke. Ak sa celý váš web zobrazuje cez index.php, ako sme si tu ukazovali, stačí nastavenie vložiť iba na začiatok indexu.

mb_internal_encoding("UTF-8");

Dĺžka reťazca

Dĺžku reťazca v znakoch získame pomocou funkcie mb_strlen(). Urobme si malú ukážku, samozrejme si nad ňou vložte ešte riadok vyššie, ktorý nastaví kódovanie.

$text = "Salvador Dalí";
$delka = mb_strlen($text);
echo("Dĺžka textu je $delka znakov.");

výstup:

Tvoja stránka
localhost

V zastaraných učebniciach a tutoriáloch nájdete používanie funkcií bez prefixu mb_. Teda miesto mb_strlen() len strlen(). Tieto funkcie nikdy nepoužívajte, pretože nevie UTF-8 a budú vám vracať zlý výstup. Napr. "Č" je v UTF kódovanie uložené ako 2 znaky (2 bajty, ako háček a C). Funkcia s prefixom mb_ berie Č ako jeden znak, funkcie bez tohto prefixu ho berie ako 2 znaky. Vracia teda zle dĺžku reťazcov s diakritikou a nedokáže rozoznať o ktoré písmená sa jedná. PHP obsahuje z dôvodu spätnej kompatibility mnoho funkcií, ktoré UTF kódovanie nepodporujú, mali by ste sa vždy pozrieť, či je funkcia tzv. Multibyte-safe a prípadne nájsť jej multibyte variantu.

Práca s podreťazci

Určitému úseku reťazca hovoríme podreťazec. Ukážme si nejaké príklady s podreťazci, pretože s tými budeme často pracovať.

Zistenie pozície podreťazca

Ak chceme zistiť, na akej pozícii sa v reťazci nachádza konkrétnej podreťazec alebo či ho text vôbec obsahuje, použijeme funkciu mb_strpos(). Aby sme si to urobili zaujímavejšie, budeme chcieť, aby nám nezáležalo na veľkosti písmen. Z toho dôvodu najprv celý reťazec prevedieme na veľké písmená pomocou funkcie mb_strtoupper() a potom v ňom budeme hľadať podreťazec, tiež veľkými písmenami.

$retezec = mb_strtoupper('Wolfgang Amadeus Mozart');
$podretezec = mb_strtoupper('amadeus');

if (mb_strpos($retezec, $podretezec) !== false)
    echo "Nájdených";
else
    echo("Nenájdené");

výstup:

Tvoja stránka
localhost

mb_strpos() vracia 0 v prípade, že je podreťazec na prvej pozícii a false v prípade, že nebol nájdený. Z tohto dôvodu je nutné výsledok porovnávať aj s ohľadom na dátový typ, ako sme sa to učili u podmienok. Inak by bolo false a 0 vyhodnotené rovnako a podreťazec by nebol nájdený v prípade, že by ním reťazec začínal.

K funkcii mb_strpos() existuje ešte funkcia mb_strrpos() (r naviac ako reverse), ktorá funguje úplne rovnako, len vyhľadáva od konca reťazca. Hodí sa napr. Keď zisťujeme príponu súboru.

V problematike vyhľadávania podreťazcov sa reťazci často hovorí kôpka sena (haystack) a podreťazci ihla (needle).

Získanie podreťazca podľa pozície

Podreťazec získame pomocou funkcie mb_substr(), ktorá berie v parametroch reťazec, index, od ktorého podreťazec začína a dĺžku podreťazca. Skúsme si to:

$text = "Wolfgang Amadeus Mozart";
echo mb_substr($text, 9, 7);

výstup:

Tvoja stránka
localhost

Získali sme podreťazec od 9. znaku, dlhý 7 znakov.

Prístup k určitému znaku

S textovými reťazcami možno v novších verziách PHP pracovať ako s poľom a to týmto spôsobom:

$text = "Mount Everest";
echo $text[0];

Podobný výsledok šlo docieliť v minulosti aj pomocou zložených zátvoriek, ale táto syntax bola z PHP odstránená. Kód vyššie vypíše 1. znak. Bohužiaľ tento spôsob ešte nepodporuje Unicode (UTF-8) a preto ho nepoužívajte. Ak potrebujete pristúpiť k nejakému znaku, jednoducho ho skopírujte ako podreťazec pomocou vyššie spomínané funkcie mb_substr().

Nahradenie podreťazca

V texte môžeme veľmi jednoducho nahradiť nejaký podreťazec iným. Docielime toho použitím funkcie str_replace() a môžeme tak jednoducho zabezpečiť napr. Emailovú adresu pred robotmi nevyžiadanej pošty tak, že znak zavináča nahradíme textom "(zavináč)". Roboti potom nespoznajú, že sa jedná o mail a nebudú vám ponúkať výhodné pôžičky :)

$adresa = '[email protected]';
$osetrenaAdresa = str_replace('@', '(zavináč)', $adresa);
echo $osetrenaAdresa;

výstup:

Tvoja stránka
localhost

Ak by v texte bolo viac takých podreťazcov, funkcia nahradí všetky.

Nahradenie podľa slovníka

Ak potrebujeme vykonať viac nahradenie, PHP ponúka funkciu strtr() (ako String Translate, áno, pomenovanie mnohých funkcií je v PHP veľmi zavádzajúce). Funkcia berie v parametroch reťazec a slovník, kde sú ako kľúče podreťazca, ktoré chceme nahradiť a ako hodnoty reťazca, ktorými ich chceme nahradiť.

Funkcia sa často používa na nahradenie textových smajlíkov v nejakom texte za HTML obrázky. Skúsme si to:

$slovnik = array(
    ':)' => '<img src="usmev.png" alt="úsmev" />',
    ':D' => '<img src="smich.png" alt="smiech" />',
);
echo strtr('Ahoj :) Je mi fajn, pretože som objavil ITnetwork :D', $slovnik);

výstup:

Tvoja stránka
localhost

Rozdelenie reťazca na pole podreťazcov

Veľmi užitočnou dvojicou funkcií sú expresívne pomenované explode() a implode(). explode() rozdelí reťazec na pole podreťazcov pomocou určitého oddeľovača. implode() naopak spojí podreťazca v poli do jedného dlhého reťazca a medzi podreťazca vloží oddeľovač. Oddeľovačmi sa niekedy expresívne hovorí lepidlo.

Nižšie uvedený jednoduchý program berie na vstupe reťazec s niekoľkými číslami, ktoré sú oddelené čiarkou. Z týchto čísel následne vypočíta súčet.

$vstup = "1,5,87,65,42,4,456,8,5,98,54,89";
$cisla = explode(',', $vstup);
echo array_sum($cisla);

explode() rozdelí reťazec podľa čiarky a vráti pole jeho častí. Pomocou funkcie array_sum() následne získame súčet prvkov v poli. Ak prichádzate z nejakého nízkeho jazyka, asi sa čudujete, ako je v PHP všetko jednoduché. Je to z toho dôvodu, že PHP je tzv. Vysoký jazyk. Práve vďaka tomu môžeme svoju energiu zamerať na vývoj aplikácie a nie na riešenie základných problémov.

PHP funkcie pre prácu s reťazcami

Na záver si uveďme zoznam tých najdôležitejších funkcií, ktoré nám PHP pre prácu s reťazcami ponúka. Každú si môžete rozkliknúť a pozrieť sa, ako sa používa. Opäť je nemusíte vedieť naspamäť, stačí vedieť, že tam sú a že si ich v prípade potreby môžete vyhľadať.

mb_internal_en­coding Nastavenie kódovania.
mb_strlen Získa dĺžku reťazca.
mb_strpos Nájde pozíciu prvého výskytu podreťazca v reťazci.
mb_substr Vráti podreťazec od štartovej pozície s určitým počtom znakov.
mb_strtoupper Prevedie všetky písmená v reťazci na veľké.
mb_strtolower Prevedie všetky písmená v reťazci na malé.
trim Odstráni biele miesto na okolo reťazca.
htmlspecialchars Prevedie špeciálne znaky v texte na HTML entity.
htmlspecialchar­s_decode Prevedie entity v texte späť na špeciálne znaky.
strip_tags Odstráni z daného reťazca HTML tagy.
nl2br Nahradí konce riadkov (\n) tagom <br />
str_replace Nahradí všetky výskyty podreťazca v reťazci daným podreťazcom.
strtr Preloží podreťazca podľa slovníka.
parse_str Rozbalí premenné z textového reťazca v tvare QUERY stringu.
Explode Prevedie reťazec na pole podreťazcov.
implode Zabalí poľa do textového reťazca.
hash Vypočíta odtlačok (hash) reťazca, čo budeme potrebovať pre ukladanie hesiel.

V nasledujúcom cvičení, Riešené úlohy k 13. lekcii PHP, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.


 

Predchádzajúci článok
Práca s poľom pomocou cyklov v PHP
Všetky články v sekcii
Základné konštrukcie jazyka PHP
Preskočiť článok
(neodporúčame)
Riešené úlohy k 13. lekcii PHP
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity