NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

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

Funkce strlen()
localhost

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:

Diakritika strlen
localhost

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:

Funkce mb_strlen()
localhost

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:

Funkce str_word_count()
localhost

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:

2. str_word_count()
localhost

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:

2. str_word_count()
localhost

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:

3. str_word_count()
localhost

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:

4. str_word_count()
localhost

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:

5. str_word_count()
localhost

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:

Tabulka ASCII - PHP funkce 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:

Vypsání výskytů znaků
localhost

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:

Funkce count_chars()
localhost

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

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:

Funkce trim()
localhost

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:

Funkce ltrim()
localhost

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:

Funkce ltrim()
localhost

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:

Funkce rtrim()
localhost

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:

Funkce rtrim()
localhost

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


 

Předchozí článek
Tagy v textovém řetězci
Všechny články v sekci
PHP funkce
Přeskočit článek
(nedoporučujeme)
Opakování textových řetězců 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