C týden
Tento týden až 80% sleva na e-learning týkající se jazyka C
50 % bodů zdarma na online výuku díky naší Slevové akci!

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

V minulé lekci, Rozdělování a spojování textových řetězců - 2. díl, jsme se dozvěděli, jak nahrazovat, měnit znaky nebo celé úseky textových řetězců.

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);
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

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
Rozdělování a spojování textových řetězců - 2. díl
Všechny články v sekci
PHP funkce
Článek pro vás napsal Pavel Vaněček
Avatar
Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!
Autor se věnuje psaní článků na Itnetwork.cz
Aktivity (5)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!