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:
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:
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í:
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:
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ů:
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ý:
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:
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"
:
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:
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:
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
:
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:
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()
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.
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()
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.