Lekce 7 - Vlastnosti textových řetězců a práce s mezerami
V předchozí lekci, Tagy v textovém řetězci, jsme si vysvětlili, jak odstraňovat, konvertovat tagy a odstraňovat zpětná lomítka pomocí funkcí v PHP.
V této lekci kurzu PHP funkcí si ukážeme, jaké vlastnosti z textových řetězců lze získat a jak pracovat s mezerami.
Odstraňovat lomítka, konvertovat speciální znaky na HTML entity a různými způsoby spojovat nebo dělit textové řetězce jsme se již naučili. Ale jak například zjistíme, jaká je délka našeho textového řetězce? Jaký počet slov náš textový řetězec vlastně má? Jak odstranit nepotřebné mezery na začátku a na konci textových řetězců? Pojďme si toto vše ukázat.
strlen()
strlen()
je velice běžnou funkcí v PHP pro zjištění délky
textového řetězce na počet bajtů. Funkce strlen()
přijímá
pouze jeden parametr, kterým je náš textový řetězec. Ukažme si to na
příkladu:
$text = "Hello world"; $len = strlen($text); print($len);
Tímto způsobem zjistíme délku zadaného textového řetězce. Výsledkem je délka textového řetězce na počet bajtů:
Můžeme si všimnout, že délka řetězce "Hello world"
je
11. Funkce strlen()
do délky totiž
započítává i mezery.
Funkce strlen()
není tzv.
multi-byte
funkcí, které bychom měli znát už z minulých
lekcí. Pokud napíšeme textový řetězec s českou diakritikou, dostali
bychom nesprávnou délku řetězce. Pro podporu češtiny nebo jiného
kódování použijeme podobnou funkci mb_strlen()
která
přijímá o jeden parametr navíc a to typ kódování.
Ukažme si rozdíl:
$text = "Řeřicha"; $len = strlen($text); // Délka textového řetězce s českou diakritikou pomocí funkce strlen() print($len);
Vypíše nám to v prohlížeči hodnotu 9
:
Nyní použijeme funkci mb_strlen()
s kódováním
UTF-8
:
$text = "Řeřicha"; $len = mb_strlen($text, "UTF-8"); // Délka textového řetězce s českou diakritikou pomocí funkce mb_strlen() print($len);
Korektně se nám vypíše délka řetězce:
str_word_count()
str_word_count()
je funkce, která vrátí počet slov
obsažených v textovém řetězci. Přijímá celkem 3 parametry:
- prvním z nich je náš textový řetězec
- druhým parametrem je typ návratové hodnoty (return)
- a třetím parametrem je znak (char), který bude počítaný jako slovo.
Slova v textovém řetězci spočítáme tímto způsobem:
$text = "This sentence is in english."; $delka = str_word_count($text); print($delka);
Použitím této funkce dostaneme jako výsledek počet slov:
Nyní si více popíšeme, jaké hodnoty může druhý parametr této funkce přijímat. V tabulce najdeme všechny hodnoty, které je možné do tohoto parametru dosadit:
Hodnota | Popis |
---|---|
0 |
Je defaultní hodnota. Vrátí počet slov jako číslo |
1 |
Vrátí textové pole s jednotlivými slovy |
2 |
Vrátí textové pole s klíčem pozice slova v textovém poli a hodnotou aktuálního slova |
Ukažme si příklad:
$text = "This sentence is in english."; $delka = str_word_count($text, 1); print_r($delka);
Zde jsme jako druhý parametr zadali hodnotu 1
a tak dostaneme
textové pole o jednotlivých slovech:
Pokud chceme jako klíč textového pole pozici slova v textovém řetězci a
jako hodnotu slovo na dané pozici, zadáme jako druhý parametr hodnotu
2
:
$text = "This sentence is in english."; $delka = str_word_count($text, 2); print_r($delka);
Výsledkem je textové pole:
Třetím parametrem je znak, který bude počítán funkcí jako slovo. Znaků můžeme napsat hned několik. Příkladem může být tento textový řetězec:
$text = "Paul & Peter are good friends"; $delka = str_word_count($text, 0, "&"); print($delka);
Znak ampersandu &
funkce nepočítá jako jedno slovo,
tudíž správný počet slov v tomto řetězci má být 5
. Avšak
zde máme uvedenou výjimku a to ve třetím parametru, znak ampersandu bude
počítán jako jedno slovo, počet slov tedy bude 6
:
Ukažme si další příklad:
$text = "Paul & Peter are the best fr1ends!"; $delka = str_word_count($text, 1); print_r($delka);
Pokud u tohoto textového řetězce nezadáme do třetího parametru žádné znaky, které mají být počítány jako další slovo, řetězec bude rozdělen takto:
Počet slov je 7
, což je správný výsledek, ale věta je
nesprávně rozdělena. Přidáme tedy do třetího parametru znaky, které
budeme považovat jako jedno slovo nebo jeho součást:
$text = "Paul & Peter are the best fr1ends!"; $delka = str_word_count($text, 1, "&1"); print_r($delka);
Výsledkem je správně rozdělené textové pole:
Třetí parametr char funkce
str_word_count()
byl přidaný až ve verzi PHP
5.1.
count_chars()
Je funkce, která vrací informace o znacích použité v textovém
řetězci. Přijímá celkem dva parametry, kde prvním z nich je náš textový
řetězec a druhým je mód. Funkce count_chars()
má hned několik
použití, závisí totiž na volbě druhého parametru, tedy
módu:
Mód | Popis |
---|---|
0 |
Pole, kde klíčem je pořadí znaku tabulky ASCII a hodnotou je počet výskytů daného znaku |
1 |
Pole, kde klíčem je pořadí znaku tabulky ASCII a hodnotou je počet výskytů daného znaku, vypisuje výskyty znaků větší než nula |
2 |
Pole, kde klíčem je pořadí znaku tabulky ASCII a hodnotou je počet výskytů daného znaku, vypisuje pouze znaky, které se v řetězci nevyskytují |
3 |
Textový řetězec, který vrátí pouze vyskytující se znaky v textovém řetězci seřazené podle ASCII tabulky |
4 |
Textový řetězec, který vrátí všechny znaky, které se nevyskytují v textovém řetězci |
Vypsáním příkladů každého módu by nám v tuto chvíli pravděpodobně neřeklo vůbec nic. Můžeme si ukázat program, který nám z textového řetězce vypíše vyskytující se znaky za pomocí módu 1:
$text = "Hello world"; // Zjistí každý znak a počet výskytů v textovém řetězci jako pole foreach (count_chars($text, 1) as $i => $pocet) { print("Znak '".chr($i)."' se v řetězci vyskytuje ".$pocet."<br>"); // Vypíše počet výskytů znaku v řetězci }
Program zkontroluje celou ASCII tabulku a do pole umístí znaky a jejich
výskyty v našem textovém řetězci, proto jsme zde zvolili mód 1. Funkce
chr()
přijímá parametr $i
hodnoty tabulky ASCII a
vrátí nám hledaný znak z tabulky. Tabulka ASCII vypadá takto:
Kód 97 je tedy například malé
a
, kód 65
je písmeno A
. Můžeme tedy
vidět, že tabulka je seřazená podle abecedy (mám na mysli pouze a-Z).
Výsledek kódu výše tedy na stránce bude:
Znaky jsou seřazené podle tabulky ASCII. Takto jsme jednoduše vypsali znaky a počty výskytů, které se v textovém řetězci objevují. Znaky, které se nám v textu vyskytují, můžeme vypsat také ve formě řetězce a to pomocí módu 3:
$text = "Hello world"; print(count_chars($text, 3));
Výsledkem je:
Opět jsou znaky seřazené podle ASCII tabulky.
Funkce count_chars()
není Multi-byte
safe, tudíž nepodporuje českou diakritiku a některé znaky nemusí
být správně spočítány a zobrazeny!
Práce s mezerami
Nyní si ukážeme pár funkcí pro práci s mezerami.
trim()
Funkce trim()
slouží k odstraňování mezer nebo také k
odstraňování znaků z obou stran textového řetězce. Tato funkce je velmi
používaná v případě, kdy se chceme zbavit nechtěných mezer z obou stran.
Ukažme si příklad:
$text = " Toto je text s mezerami "; $trim = trim($text); print($trim);
Mezery se nám z obou stran textového řetězce odstraní a na stránce uvidíme text bez mezer na začátku a na konci:
Funkce je často využívána pro odstranění mezer z textových polí a následně jsou data ukládány do databáze. Chceme-li se zbavit na obou stranách řetězce jiných nechtěných znaků kromě mezer, můžeme je do druhého parametru vypsat:
$text = "ĚRNěkteré znaky jsou nechtěnéŠŘ"; $trim = trim($text, "ĚRŠŘ"); print($trim);
Pomocí funkce trim()
odstraníme nechtěné znaky v textovém
řetězci, tedy ĚR
a ŠŘ
. Na stránce poté uvidíme
řetězec:
ltrim()
Na rozdíl od funkce trim()
odstraňuje přebytečné
mezery nebo nechtěné znaky pouze vlevo, tedy na
začátku textového řetězce. Ukažme si jednoduchý příklad:
$text = " <- mezery zleva"; $ltrim = ltrim($text); print($ltrim);
Mezery zleva se odstraní a na stránce zůstane zbytek řetězce:
Do druhého parametru napíšeme nechtěné znaky pro jejich odstranění. Avšak znaky budou odstraněny pouze na levé části textového řetězce:
$text = "RDodstranění nechtěných znakůBS"; $ltrim = ltrim($text, "RDBS"); print($ltrim);
Výsledným textem tedy bude:
Můžeme si všimnout, že znaky BS
na konci řetězce nebyly
odstraněny.
rtrim()
Na rozdíl od funkce ltrim()
odstraňuje mezery a nechtěné
znaky na konci textového řetězce. Přijímá stejný počet parametrů.
Příklad funkce rtrim()
:
$text = "mezery zprava -> "; $rtrim = rtrim($text); print($rtrim);
Mezery zprava se odstraní a na stránce zůstane zbytek řetězce:
Do druhého parametru zapisujeme nechtěné znaky, které budou odstraněny zprava, tedy na konci řetězce:
$text = "RDodstranění nechtěných znakůBS"; $rtrim = rtrim($text, "RDBS"); print($rtrim);
Výsledným textem bude:
Zde došlo k odstranění znaků na konci řetězce. Znaky RD
oproti funkci ltrim()
na začátku zůstaly.
Nechtěné znaky v druhém parametru funkce
trim()
, ltrim()
, rtrim()
zapisujeme vždy
do uvozovek (nebo apostrofů)!
Namísto rtrim()
můžeme použít její alias
chop()
, avšak funkce chop()
je spíše pro
vývojáře matoucí a proto se nevyužívá.
V další lekci, Opakování textových řetězců v PHP, si vysvětlíme, jak opakovat jednotlivé znaky v textových řetězcích a části textových řetězců.