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.
{PHP}
mb_internal_encoding("UTF-8");
$text = "Salvador Dalí";
$delka = mb_strlen($text);
echo("Dĺžka textu je $delka znakov.");
{/PHP}
výstup:
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.
{PHP}
mb_internal_encoding("UTF-8");
$retezec = mb_strtoupper('Wolfgang Amadeus Mozart');
$podretezec = mb_strtoupper('amadeus');
if (mb_strpos($retezec, $podretezec) !== false)
echo "Nájdených";
else
echo("Nenájdené");
{/PHP}
výstup:
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:
{PHP}
mb_internal_encoding("UTF-8");
$text = "Wolfgang Amadeus Mozart";
echo mb_substr($text, 9, 7);
{/PHP}
výstup:
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:
{PHP}
mb_internal_encoding("UTF-8");
$text = "Mount Everest";
echo $text[0];
{/PHP}
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
{PHP}
mb_internal_encoding("UTF-8");
$adresa = '[email protected]';
$osetrenaAdresa = str_replace('@', '(zavináč)', $adresa);
echo $osetrenaAdresa;
{/PHP}
výstup:
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:
{PHP}
mb_internal_encoding("UTF-8");
$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);
{/PHP}
výstup:
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.
{PHP}
mb_internal_encoding("UTF-8");
$vstup = "1,5,87,65,42,4,456,8,5,98,54,89";
$cisla = explode(',', $vstup);
echo array_sum($cisla);
{/PHP}
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_encoding | 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. |
htmlspecialchars_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í.