NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

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:

Funkce substr()
localhost

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

Funkce substr()
localhost

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:

Funkce substr()
localhost

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:

Funkce substr()
localhost

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:

Funkce substr()
localhost

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:

PHP funkce

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:

Funkce mb_substr()
localhost

Bez podpory multi-byte znaků by text vypadal takto:

Funkce substr()
localhost

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:

Funkce chunk_split()
localhost

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

Funkce chunk_split()
localhost

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:

Funkce chunk_split()
localhost

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

Funkce str_pad()
localhost

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:

Funkce str_pad()
localhost

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:

Funkce str_pad()
localhost

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()
localhost

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čů:

Tvoje stránka
localhost

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:

Tvoje stránka
localhost

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

Funkce strtok()
localhost

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:

funkce parse_str()
localhost

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:

funkce parse_str()
localhost

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:

funkce parse_str()
localhost

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í.


 

Předchozí článek
Rozdělování a spojování textových řetězců
Všechny články v sekci
PHP funkce
Přeskočit článek
(nedoporučujeme)
Kvíz - Textové řetězce, jejich výpis a spojování v PHP
Článek pro vás napsal Pavel Vaněček
Avatar
Uživatelské hodnocení:
6 hlasů
Autor se věnuje psaní článků na Itnetwork.cz
Aktivity