Lekce 13 - Funkce pro práci s řetězci v PHP
V předešlém cvičení, Řešené úlohy k 12. lekci PHP, jsme si procvičili nabyté zkušenosti z předchozích lekcí.
V dnešním PHP tutoriálu si ukážeme PHP funkce pro textové řetězce.
Textové řetězce a UTF-8
Část PHP funkcí pro práci s řetězci začíná prefixem
mb_
. Je to z toho důvodu, že tyto funkce podporují UTF-8
kódování (MB jako MultiByte). V kódování UTF-8 se píše naprostá
většina webů, protože umí většinu znaků většiny národních abeced.
Není tedy problém na webu použít češtinu, dále citovat něco rusky nebo
používat speciální znaky jako ☺
nebo ♥
.
Většina IDE (např. NetBeans) tvoří projekty vždy jako UTF-8. Pokud UTF-8
nepoužíváte, setkáte se časem s velkými problémy, např. tehdy, když
budete chtít použít nějakou cizí knihovnu. Její autor totiž určitě
počítá s tím, že UTFko používáte.
Jakmile v aplikaci používáme tyto funkce, musíme často nejprve nastavit
kódování, jinak nebudou korektně fungovat ve starších verzích PHP.
Kódování stačí nastavit jen jednou v každém požadavku. Pokud se celý
váš web zobrazuje přes index.php
, jak jsme si zde ukazovali,
stačí nastavení vložit pouze na začátek indexu.
mb_internal_encoding("UTF-8");
Délka řetězce
Délku řetězce ve znacích získáme pomocí funkce
mb_strlen()
. Udělejme si malou ukázku, samozřejmě si nad ní
vložte ještě řádek výše, který nastaví kódování.
{PHP}
mb_internal_encoding("UTF-8");
$text = "Černé díry jsou tam, kde bůh dělil nulou";
$delka = mb_strlen($text);
echo("Délka textu je $delka znaků.");
{/PHP}
Výstup:
V zastaralých učebnicích a tutoriálech naleznete použití
funkcí bez prefixu mb_
. Tedy místo mb_strlen()
jen
strlen()
. Tyto funkce nikdy nepoužívejte, jelikož neumí UTF-8 a
budou vám vracet špatný výstup. Např. "Č"
je v UTF
kódování uloženo jako 2
znaky (2
bajty, jako
háček
a C
). Funkce s prefixem mb_
bere
Č
jako jeden znak, funkce bez tohoto prefixu ho bere jako
2
znaky. Vrací tedy špatně délku řetězců s diakritikou a
nedokáže rozeznat o která písmena se jedná. PHP obsahuje z důvodu zpětné
kompatibility mnoho funkcí, které UTF kódování nepodporují, měli byste se
vždy podívat, zda je funkce tzv. multibyte-safe a případně najít její
multibyte variantu.
Práce s podřetězci
Určitému úseku řetězce říkáme podřetězec. Ukažme si nějaké příklady s podřetězci, jelikož s těmi budeme často pracovat.
Zjištění pozice podřetězce
Pokud chceme zjistit, na jaké pozici se v řetězci nachází konkrétní
podřetězec nebo zda ho text vůbec obsahuje, použijeme funkci
mb_strpos()
. Abychom si to udělali zajímavější, budeme chtít,
aby nám nezáleželo na velikosti písmen. Z toho důvodu nejprve celý
řetězec převedeme na velká písmena pomocí funkce
mb_strtoupper()
a poté v něm budeme hledat podřetězec, též
velkými písmeny.
{PHP}
mb_internal_encoding("UTF-8");
$retezec = mb_strtoupper('PHP tutoriály na ITnetwork.');
$podretezec = mb_strtoupper('itnetwork');
if (mb_strpos($retezec, $podretezec) !== false)
echo "Nalezeno";
else
echo("Nenalezeno");
{/PHP}
Výstup:
mb_strpos()
vrací 0
v případě, že je
podřetězec na první pozici a false
v případě, že nebyl
nalezen. Z tohoto důvodu je nutné výsledek porovnávat i s ohledem
na datový typ, jak jsme se to učili u podmínek. Jinak by bylo
false
a 0
vyhodnoceno stejně a podřetězec by nebyl
nalezen v případě, že by jím řetězec začínal.
K funkci mb_strpos()
existuje ještě funkce
mb_strrpos()
(r
navíc jako reverse),
která funguje úplně stejně, jen vyhledává od konce řetězce. Hodí se
např. když zjišťujeme příponu souboru.
V problematice vyhledávání podřetězců se řetězci často říká kupka sena (haystack) a podřetězci jehla (needle).
Získání podřetězce podle pozice
Podřetězec získáme pomocí funkce mb_substr()
, která bere v
parametrech řetězec, index, od kterého podřetězec začíná a délku
podřetězce. Zkusme si to:
{PHP}
mb_internal_encoding("UTF-8");
$text = "Černé díry jsou tam, kde bůh dělil nulou.";
echo mb_substr($text, 6, 4);
{/PHP}
Výstup:
Získali jsme podřetězec od 7. znaku, dlouhý 4 znaky.
Přístup k určitému znaku
S textovými řetězci lze v novějších verzích PHP pracovat jako s polem a to tímto způsobem:
{PHP}
mb_internal_encoding("UTF-8");
$text = "Nějaký text";
echo $text[0];
{/PHP}
Podobného výsledku šlo docílit v minulosti i pomocí složených
závorek, ale tato syntaxe byla z PHP odstraněna. Kód výše vypíše 1. znak.
Bohužel tento způsob ještě nepodporuje Unicode (UTF-8) a proto ho
nepoužívejte. Pokud potřebujete přistoupit k nějakému znaku,
jednoduše ho zkopírujte jako podřetězec pomocí výše zmíněné funkce
mb_substr()
.
Nahrazení podřetězce
V textu můžeme velmi jednoduše nahradit nějaký podřetězec jiným.
Docílíme toho použitím funkce str_replace()
a můžeme tak
jednoduše zabezpečit např. emailovou adresu před spamboty tak, že znak
zavináče nahradíme textem "(zavináč)"
. Roboti pak nepoznají,
že se jedná o email a nebudou vám nabízet výhodné půjčky
{PHP}
mb_internal_encoding("UTF-8");
$adresa = '[email protected]';
$osetrenaAdresa = str_replace('@', '(zavináč)', $adresa);
echo $osetrenaAdresa;
{/PHP}
Výstup:
Pokud by v textu bylo více takových podřetězců, funkce nahradí všechny.
Nahrazení podle slovníku
Pokud potřebujeme provést více nahrazení, PHP nabízí funkci
strtr()
(jako STRing TRanslate, ano, pojmenování mnoha funkcí je
v PHP velmi zavádějící). Funkce bere v parametrech řetězec a slovník, kde
jsou jako klíče podřetězce, které chceme nahradit a jako hodnoty řetězce,
kterými je chceme nahradit.
Funkce se často používá k nahrazení textových smajlíků v nějakém textu za HTML obrázky. Zkusme si to:
{PHP}
mb_internal_encoding("UTF-8");
$slovnik = array(
':)' => '<img src="usmev.png" alt="úsměv" />',
':D' => '<img src="smich.png" alt="smích" />',
);
echo strtr('Ahoj :) Je mi fajn, protože jsem objevil ITnetwork :D', $slovnik);
{/PHP}
Výstup:
Rozdělení řetězce na pole podřetězců
Velmi užitečnou dvojicí funkcí jsou expresivně pojmenované
explode()
a implode()
. explode()
rozdělí řetězec na pole podřetězců pomocí určitého oddělovače.
implode()
naopak spojí podřetězce v poli do jednoho dlouhého
řetězce a mezi podřetězce vloží oddělovač. Oddělovači se někdy
expresivně říká lepidlo.
Níže uvedený jednoduchý program bere na vstupu řetězec s několika čísly, které jsou oddělené čárkou. Z těchto čísel následně vypočítá souč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()
rozdělí řetězec podle čárky a vrátí pole jeho
částí. Pomocí funkce array_sum()
následně získáme součet
prvků v poli. Pokud přicházíte z nějakého nízkého jazyka, asi se
divíte, jak je v PHP vše jednoduché. Je to z toho důvodu, že PHP je tzv.
vysoký jazyk. Právě díky tomu můžeme svou energii zaměřit na vývoj
aplikace a ne na řešení základních problémů.
PHP funkce pro práci s řetězci
Na závěr si uveďme seznam těch nejdůležitějších funkcí, které nám PHP pro práci s řetězci nabízí. Každou si můžete rozkliknout a podívat se, jak se používá. Opět je nemusíte umět nazpaměť, stačí vědět, že tam jsou a že si je v případě potřeby můžete vyhledat.
mb_internal_encoding | Nastavení kódování. |
mb_strlen | Získá délku řetězce. |
mb_strpos | Najde pozici prvního výskytu podřetězce v řetězci. |
mb_substr | Vrátí podřetězec od startovní pozice s určitým počtem znaků. |
mb_strtoupper | Převede všechna písmena v rětězci na velká. |
mb_strtolower | Převede všechna písmena v rětězci na malá. |
trim | Odstraní bílé místo na okolo řetězce. |
htmlspecialchars | Převede speciální znaky v textu na HTML entity. |
htmlspecialchars_decode | Převede entity v textu zpět na speciální znaky. |
strip_tags | Odstraní z daného řětězce HTML tagy. |
nl2br | Nahradí konce řádků (\n ) tagem
<br /> |
str_replace | Nahradí všechny výskyty podřetězce v řetězci daným podřetězcem. |
strtr | Přeloží podřetězce podle slovníku. |
parse_str | Rozbalí proměnné z textového řetězce ve tvaru QUERY stringu. |
explode | Převede řetězec na pole podřetězců. |
implode | Zabalí pole do textového řetězce. |
hash | Vypočítá otisk (hash) řetězce, což budeme potřebovat pro ukládání hesel. |
V následujícím cvičení, Řešené úlohy k 13. lekci PHP, si procvičíme nabyté zkušenosti z předchozích lekcí.
Komentáře


Zobrazeno 10 zpráv z 10.