Lekce 4 - Rozdělování a spojování textových řetězců - 2. díl
V předchozí lekci, Rozdělování a spojování textových řetězců, jsme si vysvětlili, jak rozdělovat a spojovat textové řetězce pomocí funkcí.
V dnešním díle si vyjmenujeme a detailně popíšeme další funkce pro rozdělování a spojování textových řetězců, které jsme si zatím neprobrali.
substr()
Nejčastěji používaná funkce v PHP pro vrácení části textového
řetězce. Funkce substr()
přijímá celkem 3 parametry,
prvním z nich je náš textový řetězec,
druhým parametrem funkce je číselná hodnota, od jaké
pozice textový řetězec začíná. Posledním parametrem je
délka vráceného textového řetězce. Ukažme si jednoduchý příklad této
funkce:
$text = "Text pro ukázku funkce substr()"; $substr = substr($text, 16); print($substr);
Je vhodné zmínit, že znak á
je tzv. multi-byte znak a je
tedy brán jako dva znaky. Tak je to stejné například i s háčky,
například znak č
. Takových funkcí, které nepodporují tyto
znaky, bude mnohem více. Probereme si je všechny v tomto kurzu.
Funkce substr()
s hodnotou 16
druhého parametru
start posouvá začátek našeho textového řetězce. Na
stránce uvidíme část řetězce:
Dostaneme pouze text posunutý o 16
pozic zleva. Pokud však
chceme posunout začátek textového řetězce zprava, využijeme záporných
čísel hodnoty druhého parametru:
$text = "Text pro ukázku funkce substr()"; $substr = substr($text, -8); print($substr);
Začátek bude posunutý zprava o 8
znaků:
Pokud bude hodnota druhého parametru nulová:
$text = "Text pro ukázku funkce substr()"; $substr = substr($text, 0); print($substr);
funkce substr()
vrátí celý textový řetězec:
Třetím parametrem definujeme délku našeho textového řetězce. Ukažme si příklad:
$text = "Text pro ukázku funkce substr()"; $substr = substr($text, 0 , 16); print($substr);
Hodnota 16
ve třetím parametru určuje novou délku textového
řetězce. Druhý parametr s nulovou hodnotou zde nehraje žádnou roli:
Jak můžeme vidět, délka řetězce je opravdu 16
a začátek
není nijak posunut. Zajímavější je, když druhý parametr nebude
nulový:
$text = "Text pro ukázku funkce substr()"; $substr = substr($text, 5 , 16); print($substr);
Druhý parametr s hodnotou 5
se společně s limitací délky
textového řetězce začne chovat jako posun zleva se zachováním zadané
délky:
Začátek zleva je posunut o 5
pozic a zároveň celková délka
řetězce je 16
. Pro lepší pochopení si ukážeme tento problém
graficky:
Pro podporu české diakritiky využijeme funkci s multi-byte
podporou mb_substr()
, kde posledním parametrem je typ
kódování.
Dáme si tedy příklad této funkce s textem přesně o počtu 23 znaků:
$text = "Ukázka české diakritiky"; $mb_substr = mb_substr($text, 0, 23, "UTF-8"); print($mb_substr);
Na stránce uvidíme bezchybně vypsaný řetězec:
Bez podpory multi-byte znaků by text vypadal takto:
chunk_split()
Je funkce pro rozdělování znaků v textovém řetězci a nahrazování
jiného znaku na místě rozdělení. Funkce přijímá celkem tři parametry,
kde prvním z nich je náš textový řetězec. Druhým
parametrem je délka kousku (tzv. chunk). Pomocí něho určíme, po
jak dlouhých kousků textový řetězec bude dělený. Třetím
parametrem je znak, který bude vypsán při každém dělení kousku,
defaultní hodnotou je zalomení řádku \r\n
. Ukažme si příklad
na funkci chunk_split()
:
$text = "Petr a Jana byli doma"; $chunk_split = chunk_split($text, 1, "."); print($chunk_split);
Náš textový řetězec bude rozdělen po jednotlivém znaku 1
a na místě rozdělení bude vypsána tečka .
. Řetězec na
stránce bude zobrazen takto:
Řetězec můžeme také rozdělit po několika znacích, například u každého třetího znaku může být na místě rozdělení jakýkoliv znak nebo několik znaků, které nás napadnou:
$text = "Toto jsou symboly kruhu"; $chunk_split = chunk_split($text, 3, '°'); print($chunk_split);
Každý třetí znak 3
bude nahrazen symbolem kruhu
°
. Na stránce uvidíme:
Pokud vynecháme poslední parametr a druhý parametr bude mít hodnotu
1
, je každý znak zalomený na novou řádku:
$text = "Hello world!"; $chunk_split = chunk_split($text, 1); print($chunk_split);
Pokud bychom na našem prohlížeči zobrazili zdrojový kód stránky, uvidíme každý znak zalomený na novou řádku. Avšak na stránce uvidíme textový řetězec, kde každý znak je rozdělen mezerou:
Můžeme si zkusit spustit skript přes příkazovou řádku. Nejprve si
najdeme cestu k souboru .php
a poté soubor spustíme příkazem
php
, např:
php C:\wamp\www\chunk_split.php
V konzoli se nám vypíše každý znak na nové řádce:
H e l l o w o r l d !
Vynecháme-li také druhý parametr, je pro něj použita defaultní hodnota
délky chunku 72
znaků.
Funkce chunk_split()
není multi-byte
safe. Znaky s českou diakritikou nebudou tedy správně
rozděleny!
str_pad()
Funkce str_pad()
vyplní textový řetězec do nějaké nové
určené délky. Nová délka řetězce je nahrazena libovolnými znaky nebo
soustavou znaků (string
). Funkce str_pad()
přijímá
celkem čtyři parametry, kde prvním z nich je náš textový
řetězec. Druhým parametrem je nová délka textového
řetězce. Pokud nová délka bude menší než délka původního řetězce,
nebude aplikována žádná změna. Třetím
parametrem je text, který bude nahrazován opakovaně do konce nové
délky textového řetězce. Posledním, čtvrtým, parametrem
je typ výplně. Můžeme rozhodnout, zda nový text ve třetím parametru bude
vyplňován zleva, zprava nebo z obou stran původního textového
řetězce.
Ukažme si první příklad:
$text = "Ota s Anetou byli v restauraci"; $str_pad = str_pad($text, 40); print($str_pad);
V tomto příkladu nám původní textový řetězec zůstal nezměněn, avšak změnila se jeho délka. Defaultní hodnotou druhého parametru je znak mezery, řetězec má nyní délku 40 doplněnou mezerami. Na stránce neuvidíme téměř žádnou změnu, avšak po otevření zdrojového kódu v prohlížeči jsou tyto mezery viditelné:
Pokud nevynecháme třetí parametr, bude námi zvolený text vypisován zleva doprava opakovaně až do konce nové délky textového řetězce:
$text = "Ota s Anetou byli v restauraci"; $str_pad = str_pad($text, 40, ".:"); print($str_pad);
Na stránce bude viditelná změna:
Nyní přidáme čtvrtý parametr, kterým určíme, z jakých stran bude nová délka textového řetězce vyplňována:
$text = "Ota s Anetou byli v restauraci"; $str_pad = str_pad($text, 40, ".:", STR_PAD_LEFT); print($str_pad);
Hodnota parametru STR_PAD_LEFT
nám text z třetího parametru
opakovaně vyplní z levé strany textového řetězce. Na stránce poté
uvidíme:
Pokud chceme mít text z třetího parametru vyplněn z obou stran,
použijeme hodnotu čtvrtého parametru STR_PAD_BOTH
:
$text = "Ota s Anetou byli v restauraci"; $str_pad = str_pad($text, 40, ".:", STR_PAD_BOTH); print($str_pad);
A text z třetího parametru bude doplněn opakovaně do nové délky textového řetězce z obou stran:
Funkce str_pad()
není multibyte
safe. Počítání nové délky textového řetězce a následně
vyplňování textu z třetího parametru je s českou diakritikou nesprávné.
Existuje multibyte safe varianta funkce mb_str_pad()
.
strtok()
Tato funkce náš textový řetězec rozdělí na několik menších řetězců (tokenů) pomocí znaku oddělovače (ang. delimeter), který jsme sami zvolili. První zavolání této funkce vyžaduje první parametr, kterým jen náš řetězec a bude nám vypsán první token. Každé další zavolání funkce je vyžadován pouze druhý parametr, kterým je oddělovač. Chceme-li pracovat s novým textovým řetězcem, zavoláme tuto funkci ještě jednou s prvním a druhým parametrem, pro další výpis tokenů do funkce píšeme jen druhý parametr. Ukažme si příklady:
$text = "Text který bude rozdělen na tokeny za pomocí oddělovače mezery."; print(strtok($text, " ")); // Další tokeny print(strtok(" ")); // 2. token print(strtok(" ")); // 3. token print(strtok(" ")); // 4. token // atp.
Z našeho textového řetězce vidíme, že prvním tokenem bude část
řetězce "Text", oddělovač do tokenu nebude započítán! Textový řetězec
dělíme pomocí mezery " "
jak můžeme vidět v druhém parametru
funkce. Další zavolání funkce strtok()
bez prvního parametru
nám vrátí další tokeny. Na stránku dostaneme celkem 4 tokeny bez
oddělovačů:
Co když ale dojde k vyčerpání tokenů?
$text = "Rozdělení krátkého textu."; print(strtok($text, " ")); // Další tokeny print(strtok(" ")); // 2. token print(strtok(" ")); // 3. token print(strtok(" ")); // Další volání funkce vrátí hodnotu false!
Jestliže dojde k vyčerpání tokenů, funkce bude vracet booleanovskou
hodnotu false
. Avšak, na stránku se vypíšou všechny
tokeny:
Můžeme také využít toho, že funkce vrací hodnotu false
při vyčerpání tokenů a navrhnout tak více praktické řešení:
$text = "Text/u/kterého/bychom/museli/opakovat/několikrát/výpis/funkce/strtok()."; $token = strtok($text, "/"); while ($token != false) { echo "$token<br>"; $token = strtok("/"); }
Využitím cyklu while
si snadno můžeme vypsat všechny
možné tokeny. Cyklus while
vypisuje tokeny dokud existují. Pokud
k proměnné $token
bude přiřazena hodnota false
,
další cyklus se neprovede a na stránce dostaneme výpis tokenů:
parse_str()
Funkce parse_str()
analyzuje textový řetězec z URL (tzv.
query) a rozdělí jej na proměnné. Funkce přijímá celkem 2
parametry, kde prvním z nich je náš textový řetězec, druhým parametrem je
název proměnné, do které jsou proměnné z URL ukládány jako hodnoty pole.
Druhý parametr je od verze PHP 8.0.0 vyžadován. Ukažme si
příklady:
$url_query = "name=Paul&age=20"; parse_str($url_query, $url); print_r($url);
Funkce nám náš textový řetězec rozdělí na proměnné a vloží je do
nové proměnné $url
jako hodnoty pole. Pokud se pokusíme vypsat
na stránku proměnnou $url
pomocí funkce print_r()
,
dostaneme přehled, jak jsou hodnoty pole v proměnné uloženy:
Chceme-li vypsat hodnotu uloženou přímo v nějakém parametru, využijeme hranatých závorek:
$url_query = "name=Paul&age=20"; parse_str($url_query, $url); print_r($url['name']);
Specifikováním parametru URL do hranatých závorek dostaneme na stránku hodnotu parametru:
Dalším příkladem může být:
$url_query = "name[]=Paul&name[]=Peter&age[]=20&age[]=21"; parse_str($url_query, $url); echo "".$url['name'][0]." is ".$url['age'][0]." years old.<br>"; echo "".$url['name'][1]." is ".$url['age'][1]." years old.<br>";
Zde jsou parametry v URL zapsané jako pole. Parametr name[]
uchovává hodnoty "Paul"
na prvním indexu a "Peter"
na druhém. Parametr age[]
uchovává hodnoty "20"
na
prvním indexu a "21"
na druhém. Na stránce uvidíme:
V následujícím kvízu, Kvíz - Textové řetězce, jejich výpis a spojování v PHP, si vyzkoušíme nabyté zkušenosti z předchozích lekcí.