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 5 - Nahrazování textových řetězců

V předchozím kvízu, Kvíz - Textové řetězce, jejich výpis a spojování v PHP, jsme si ověřili nabyté zkušenosti z předchozích lekcí.

V této lekci kurzu PHP funkcí si vyjmenujeme a detailně popíšeme funkce pro nahrazování textových řetězců příslušnými znaky a nebo svým textem.

Nahrazování textových řetězců

Určitě jsme se někdy ocitli v situaci, kdy jsme nějakým jednoduchým způsobem potřebovali nahradit nějaké slovo ve velice dlouhém textu. Pokud vynechám textové editory a jejich funkce vyhledání a nahrazení slov, existuje v PHP soubor funkcí pro nahrazování textových řetězců, který při správném použití tuto problematiku dokáže vyřešit za nás.

str_replace()

Tato funkce nalezne hledané znaky a nahradí je jinými znaky v textovém řetězci nebo také v poli. Funkce str_replace() je tzv. case-sensitive, což znamená, že se rozlišují velká a malá písmena. Ukažme si příklad:

$text = "Včera jsem měl hlad, hlad na sladké";
$nahrazeni = str_replace("hlad", "chuť", $text);
print($nahrazeni);

Prvním parametrem hledáme v textu všechna slova "hlad". Druhým parametrem nahrazujeme hledané slovo slovem "chuť". Třetím parametrem je náš textový řetězec $text, ve kterém nahrazujeme uvedené znaky. Na stránce uvidíme:

Funkce str_replace()
localhost

Sami si asi nevšimneme, že funkce str_replace() je tzv. binary-safe. To znamená, že textový řetězec může obsahovat diakritiku a také znaky Unicode. Můžeme nahrazovat například emoji:

$emoji = "☺☻♥☺♦";
$nahrazeni = str_replace("☺", "♣", $emoji);
print($nahrazeni);

Znak smajlíka nahradíme znakem trojlístku:

Funkce str_replace()
localhost

Můžeme také nahrazovat znaky nebo text v polích:

$pole = array("Router", "Switch", "HUB", "Tiskárna");
$nahrazeni = str_replace("Tiskárna", "Print server", $pole, $i);
print_r($nahrazeni); // Zobrazení pole nahrazeného o příslušné znaky
print("<br>Nahrazení proběhlo: ".$i); // Výpis počítadla nahrazení slov

Vytvoříme si textové pole tak, jako u běžného textového řetězce dojde se správným použitím funkce str_replace() k nahrazení znaků. Zde se nám objeví možnost využít čtvrtý parametr, který nám zjistí počet nahrazených slov. Výsledkem je výpis nahrazeného textového pole s počtem nahrazení:

Funkce str_replace()
localhost

Jestliže chceme nahrazovat znaky nebo text bez závislosti na velkých a malých písmenech, využijeme funkci str_ireplace(), která funguje stejně, ale je case-insensivite.

Velice jednoduchým příkladem str_ireplace() funkce může být:

$text = "Rybíz mám rád, rybíz rád jím.";
$nahrazeni = str_ireplace("rybíz", "maliny", $text);
print($nahrazeni);

Na rozdíl od funkce str_replace() dojde k nahrazení znaků bez závislosti na velkých a malých písmenech:

Funkce str_ireplace()
localhost

substr_replace()

Funkce substr_replace() nahrazuje znaky nebo části textu jinými. Funkce přijímá parametry textového řetězce, text k nahrazení, začátek nahrazování a délku. Vypadá tedy takto: substr_replace(string, replacement, start, length);. Pro začátek si uvedeme jednoduchý příklad:

$text = "Java";
$nahrazeni = substr_replace($text, "PHP", 0); // Nahrazení textu od začátku
print($nahrazeni);

V proměnné $text je uložen text "Java", zde pomocí funkce substr_replace() nahradíme tento text za text "PHP" od začátku. Začátek nám určuje hodnota 0 jako třetí parametr. To znamená, že text bude nahrazen zleva až do konce. V tomto příkladu je text nahrazen celý bez ohledu na délce znaků:

Funkce substr_replace()
localhost

Chceme-li nahradit celý text kromě prvního znaku v původním textovém řetězci $text, provedeme to následovně:

$text = "Java";
$nahrazeni = substr_replace($text, "PHP", 1); // Nahrazení textu zleva s posunutým začátkem
print($nahrazeni);

Textový řetězec se začne nahrazovat až od druhého znaku, jelikož je začátek nahrazování textu posunutý:

Funkce substr_replace()
localhost

Může nastat situace, kdy budeme chtít text nahrazovat zprava původního textového řetězce. Zde využijeme záporných čísel, které nám řetězec budou nahrazovat textem zprava:

$text = "Java";
$nahrazeni = substr_replace($text, "PHP", -1); // Nahrazení textu zprava s posunutým začátkem
print($nahrazeni);

Dojde tak k nahrazení textového řetězce "Java" textem "PHP" zprava a s posunutým začátkem o jeden znak:

Funkce substr_replace()
localhost

Chceme-li náš text "PHP" přesunout na začátek původního textového řetězce, využijeme parametr délky (length):

$text = "Java";
$nahrazeni = substr_replace($text, "PHP", 0, 0); // Posunutí textu "PHP" na začátek řetězce
print($nahrazeni);

Předposlední parametr začátku (start) s hodnotou 0 nám říká, že nahrazování řetězce začíná zleva, ale poslední parametr délky (length) s hodnotou 0 nám říká, že text chceme posouvat. Konečný výsledek na stránce je tedy text "PHP" posunutý na začátku textového řetězce "Java":

Funkce substr_replace()
localhost

Kladná čísla posledního parametru funkce substr_replace() nám udávají, jaká délka textového řetězce má být nahrazena. Záporná čísla zase určují, kolik znaků by mělo z původního řetězce zůstat. Příkladem může být pole textových řetězců:

$pole = array("111", "111", "111");
$nahrazeni = substr_replace($pole, "222", 0,3);
print_r($nahrazeni);

Všechny textové řetězce 111 v poli budou nahrazeny textovým řetězcem 222 od začátku 0 s délkou nahrazování 3 znaků. Výstupem na stránku bude:

Funkce substr_replace()
localhost

Pokud poslední parametr funkce substr_replace() bude záporný, určujeme, jaká bude délka původního textového řetězce zprava:

$text = "Mám rád housky";
$nahrazeni = substr_replace($text, "_", 0, -6);
print_r($nahrazeni);

Zde nahrazujeme původní textový řetězec podtržítkem "_", které bude zobrazeno hned na začátku nového řetězce. Zbytek původního textového řetězce bude smazán, ale podle posledního parametru s hodnotou -6 zůstane jen ta část řetězce, která je dlouhá 6 znaků zprava.

V případě diakritiky, například v textu Mám rád houský, zůstane pouze posledních 5 znaků zprava. Znak ý je totiž brán jako dvojznak (multi-byte).

Výsledkem je:

Funkce substr_replace()
localhost

Jak můžeme vidět, zbytek řetězce "Mám rád " byl vypuštěn a byl nahrazen podtržítkem. Z původního řetězce zůstal pouze text "housky" dlouhý přesně 6 znaků.

strtr()

Tato funkce nám překládá určité znaky do našeho textového řetězce. Chceme-li v našem textovém řetězci nahradit například všechny znaky a za znaky b, funkce strtr() tento problém vyřeší za nás. Uveďme si jednoduchý příklad nahrazování jednoho znaku za jiný:

$text = "Hhoj světe";
$nahrazeni = strtr($text, "H", "A");
print($nahrazeni);

V textovém řetězci "Hhoj světe" je znak H nahrazen za znak A:

Funkce strtr()
localhost

Vznikne tak nový řetězec "Ahoj světe". Mnohem zajímavější je, když chceme nahradit znaků hned několik. Ukažme si příklad:

$text = "Alry! Yak te dnot mčš?";
$nahrazeni = strtr($text, "lryYtoč", "hojJseá");
print($nahrazeni);

Můžeme zde vidět zprvu nesmyslnou větu "Alry! Yak te dnot mčš?", která bude dále pomocí funkce strtr() nahrazena o správné znaky. Druhý parametr této funkce jsou znaky, které mají být v textu nahrazeny. Třetí parametrem jsou znaky které budou nahrazeny ve větě místo hledaných znaků v druhém parametru.

Může to být složité na pochopení, ale ve skutečnosti je to velmi jednoduché. Například znak l v druhém parametru funkce bude nalezen v naší větě a každý tento znak bude nahrazen znakem h ve třetím parametru funkce. Oba tyto znaky se nacházejí na první pozici v parametru, další znaky budou nahrazovány stejným způsobem:

  • l => h
  • r => o
  • y => j
  • Y => J
  • t => s
  • o => e
  • č => á

Po nahrazení všech příslušných znaků na stránce uvidíme smysluplnou větu:

Funkce strtr()
localhost

Pravděpodobně tuto funkci budeme chtít využít také v textových polích. Pole v této funkci slouží jako soubor překladů, respektive návod, jaký znak nebo soubor znaků má být vyhledán a následně jaký znak nebo soubor znaků má být místo něj nahrazen. Například:

$preklad = array("není" => "je", "kulatá" => "placatá");
$nahrazeni = strtr("Země není kulatá!", $preklad);
print($nahrazeni);

Vysvětlíme si tento problém na větě "Země není kulatá!". Proměnná $preklad obsahuje soubor klíčů a hodnot pole, v tomto případě klíč například "není" je ve větě vyhledán a následně je za něj nahrazena hodnota, která se schovávala pod tímto klíčem, text "je". Další soubor klíče a hodnoty je vyhledán a nahrazen ve větě stejným způsobem:

Funkce strtr()
localhost

Funkce strtr() má ve skutečnosti 2 modely, kde 1. z nich přijímá 3 parametry a 2. pouze 2 parametry. Nyní si ukážeme, jaký je mezi nimi rozdíl:

print (strtr("2ff2", "2f", "01")); // 1. model

$preklad = array("2f" => "01");
print (strtr("2ff2", $preklad)); // 2. model

1. model nám říká, že místo znaku 2 bude v textu nahrazena 0 a místo znaku f zase 1. Bude zde tedy celý text nahrazen za jedničky a nuly.

Funkce strtr()
localhost

2. model, který jsme si vysvětlovali naposledy, vyhledá a nahrazuje celé textové řetězce. Hledáme zde textový řetězec 2f a pokud bude v textu nalezen, bude nahrazen za řetězec 01. Text, který neodpovídá vyhledávání, nebude nahrazen a bude zachován.

Funkce strtr()
localhost

Funkce strtr() je case-sensitive. Pokud nechceme rozlišovat velká a malá písmena, je nejlepší použít výše zmíněnou case-insensitive funkci str_ireplace().

V další lekci, Tagy v textovém řetězci, se dozvíme, jak zjistit vlastnosti textových řetězců a odstranit přebytečné mezery pomocí funkcí v PHP.


 

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