Lekce 12 - Vyhledávání textových řetězců v PHP
V minulé lekci, Porovnávání textových řetězců v PHP II. část, jsme si ukázali další funkce pro porovnávání textových řetězců.
V této lekci funkcí v PHP si vysvětlíme užitečné funkce pro vyhledávání textových řetězců a jejich částí.
strspn()
Je funkce, která vrátí počet hledaných znaků v řetězci. Pokud se ale
v řetězci nachází před hledanými znaky znak, který mezi ně nepatří,
vrátí funkce hodnotu 0
. Funkce přijímá 4 parametry, kde
prvním z nich je náš textový řetězec. Druhým parametrem je hledaný znak
nebo skupina znaků. Třetím parametrem je pozice, odkud má funkce v textovém
řetězci začít vyhledávat (nepovinný). Posledním parametrem je délka
řetězce (v jak velké části řetězce budou znaky hledány) (nepovinný).
Funkce je binary-safe. Ukažme si příklady:
$strspn = strspn("Znaky se nacházejí v této větě.",'Zzykan'); print_r($strspn);
Výstupem na stránku bude počet znaků, které se shodují v hledané masce
'Zzykan'
, avšak pouze do prvního znaku, který se v masce
nenachází, v tomto případě je to mezera. Dostaneme tedy hodnotu
5
.
$strspn = strspn("Hledané znaky se nacházejí v této větě.",'Zzykan'); print_r($strspn);
V tomto případě funkce vrátí hodnotu 0
, jelikož se před
maskou hledaných znaků nachází znaky, které se v ní nevyskytují.
Sčítání znaků tedy pokračuje do první neshody, což je písmeno
H
, které nebude započítáno.
$strspn = strspn("Tyto znaky se nacházejí v této větě.",'Zzykan', 5); print_r($strspn);
Přidáním třetího parametru začneme znaky vyhledávat až od 5.
znaku. Řetězec "Tyto "
společně s mezerou bude
přeskočen a shody či neshody znaků v masce nebudou ověřeny. Funkce tedy
začne ověřovat až od textového řetězce "znaky"
kde při
první neshodě znaku řetězce s maskou bude počítání ukončeno. Na výstup
dostaneme hodnotu 5
.
$strspn = strspn("Tyto znaky se nacházejí v této větě.",'Zzykan', 5, 3); print_r($strspn);
Stejně jako v předchozím příkladu, vyhledávání a počítání znaků
je posunuto o 5
znaků, avšak jsme také definovali 4. parametr,
který nám limituje délku zbytku řetězce, v tomto
případě na 3
znaky, tedy pouze porovnáváme řetězec
"zna"
. Jelikož se všechny tyto znaky nacházejí v masce
hledaných znaků, bude na výstup vrácena hodnota 3
.
strcspn()
Je funkce, která vrátí počet znaků (tedy i mezer) nalezených do prvního výskytu hledaného znaku (nikoli za ním). Funkce přijímá čtyři parametry, kde prvním z nich je náš textový řetězec. Druhým parametrem je hledaný znak nebo skupina znaků (nepovinný parametr). Třetím parametrem je pozice, odkud má funkce v textovém řetězci začít vyhledávat (nepovinný). Posledním parametrem je délka řetězce (v jak velké části řetězce budou znaky hledány), parametr je taktéž nepovinný. Funkce je binary-safe, avšak diakritiku zase počítá jako dva znaky. Ukažme si příklady:
$strcspn = strcspn("Hello my strange PHP world!",'w'); print_r($strcspn);
V tomto textovém řetězci bude vyhledán první znak 'w'
a na
výstup dostaneme počet znaků před hledaným znakem. V tomto
případě je to číslo 21
.
Pokud chceme určit odkud bude funkce vyhledávat, přidáme druhý parametr:
$strcspn = strcspn("Hello world!",'w', 4); print_r($strcspn);
Zde vyhledávání začne až od páté pozice, tedy znakem 'o'
.
Na výstup dostaneme číslo 16
.
Chceme-li omezit velikost vyhledávání v textovém řetězci, využijeme třetí parametr:
$strcspn = strcspn("Hello world!",'w', 0, 4); print_r($strcspn);
V tomto případě stejně jako u předchozího příkladu hledáme znak
'w'
od začátku řetězce (od pozice 0
), ale až do
pozice 4
, textový řetězec tedy není prohledáván celý, ale
pouze jeho část "Hell"
. Můžeme si všimnout, že v této
části řetězce se hledaný znak nenachází, funkce tedy vrátí délku
části řetězce, tedy 4
.
strstr()
Je funkce, která nalezne vyhledávaný řetězec a vrátí hledaný
řetězec se zbytkem textového řetězce. Funkce přijímá celkem 3 parametry,
kde prvním z nich je textový řetězec, druhým parametrem je vyhledávaný
řetězec a třetím boolean hodnota (true
nebo
false
), která nastavuje, zda bude vrácen zbytek textového
řetězce od začátku ke shodě vyhledaného řetězce (true
),
nebo od shody vyhledaného řetězce ke konci (false
). Funkce
je case-sensitive, tedy záleží na velikosti písmen. Pro
lepší pochopení si tuto problematiku ukažme na příkladech:
$strstr = "Jirka přijede později."; print_r(strstr($strstr, "přijede"));
V textovém řetězci "Jirka přijede později."
bude vyhledán
řetězec "přijede"
a vrátí hledaný řetězec se zbytkem
celkového řetězce. Jelikož jsme nenastavili třetí parametr, je jeho
defaultní hodnota false
. Výstupem na stránku tedy bude
"přijede později."
.
$strstr = "Jirka přijede později."; print_r(strstr($strstr, "přijede", true));
Příklad výše je stejný jako v příkladu výše, jen jsme uvedli třetí
parametr. Ten zajistí, že nám na výstup vrátí řetězec od začátku
textového řetězce do hledaného řetězce. Hledaný řetězec ale již
nebude tvořit součást výstupu na stránku. Výstupem na
stránku tedy bude "Jirka"
.
Pokud zadáme prázdný hledaný řetězec, dostaneme
výjimku "Empty needle"
.
Funkce strstr()
není multibyte
safe! Pro správné hodnoty na výstupu funkce s řetězcem
obsahujícím diakritiku, použijeme multibyte safe variantu
mb_strstr()
stristr()
Tato funkce je má totožné vlastnosti, jako funkce strstr()
.
Jedinou výjimkou je však vlastnost case-insensitive, tedy
nezáleží na velikosti písmen. Je to tedy funkce, která nalezne
vyhledávaný řetězec a vrátí hledaný řetězec se zbytkem textového
řetězce. Přijímá celkem 3 parametry, kde prvním z nich je textový
řetězec, druhým parametrem je vyhledávaný řetězec a třetím boolean
hodnota (true
nebo false
). Ten nastavuje, zda bude
vrácen zbytek textového řetězce od začátku ke shodě vyhledaného
řetězce (true
) nebo od shody vyhledaného řetězce ke konci
(false
). Ukažme si příklad, v kterém je tato funkce oproti
strstr()
rozdílná:
$stristr = "Jirka přijede později."; print_r(stristr($stristr, "PřijedE"));
Výstup bude stejný jako u funkce strstr()
, ale hledaný
řetězec bude vyhledán i přestože obsahuje rozdílnou velikost znaků.
Pokud zadáme prázdný hledaný řetězec (2. parametr),
dostaneme taktéž výjimku "Empty needle"
.
Funkce stristr()
není multibyte
safe. Chceme-li psát text s diakritikou, využijeme tedy
multibyte safe variantu funkce s názvem
mb_stristr()
.
strchr()
Tato funkce je aliasem funkce strstr()
, tedy má totožné
vlastnosti. Nalezne vyhledávaný řetězec a vrátí hledaný řetězec se
zbytkem textového řetězce. Funkce přijímá celkem 3 parametry, kde prvním
z nich je textový řetězec, druhým parametrem je vyhledávaný řetězec a
třetím boolean hodnota (true
nebo false
). Ta
nastavuje, zda bude vrácen zbytek textového řetězce od začátku ke shodě
vyhledaného řetězce (true
), nebo od shody vyhledaného řetězce
ke konci (false
). Funkce je case-sensitive, tedy
záleží na velikosti písmen. Ukažme si příklad:
$strchr = "Jirka přijede později."; print_r(strchr ($strchr , "později"));
Stejně jako u funkce strstr()
. Bude vyhledán hledaný
řetězec v našem zadaném textovém řetězci a vrátí zbytek textového
řetězce společně s hledaným řetězcem. Výstupem tedy je
"později."
.
strrchr()
Je funkce, která nalezne poslední shodu vyhledávaného znaku v našem textovém řetězci a vrátí zbytek textového řetězce. Funkce přijímá celkem 2 parametry, kde prvním z nich je textový řetězec, druhým parametrem je vyhledávaný znak. Druhý parametr může sice obsahovat více znaků (slovo), ale v potaz bude brán pouze první znak. Funkce je case-sensitive. Ukažme si příklad:
$strrchr = "Aleš došel nakoupit potraviny, Karel došel koupit dárky."; print_r(strrchr($strrchr, "došel"));
Funkce strrchr()
nalezne znak "d"
(protože se bere
v potaz pouze první znak v 2. parametru) ve slově "dárky"
v
druhé větě, protože jde o poslední shodu. Funkce vrátí zbytek textového
řetězce včetně znaku shody. Výstupem je tedy textový
řetězec "dárky."
.
Dobrým příkladem pro tuto funkci je například k získání názvu souboru z cesty:
$strrchr = "/var/www/html/index.php"; print_r(strrchr($strrchr, "/"));
Na výstupu funkce bude /index.php
.
Pokud zadáme prázdný hledaný řetězec, tak oproti
předchozím funkcím na stránce neuvidíme žádnou chybovou hlášku ani
hodnotu. Skutečností je, že funkce vrátí boolean s hodnotou
false
.
Funkce strrchr()
není multibyte
safe. Pro zaručení správného výstupu funkce při psaní textů s
diakritikou použijeme její multibyte safe variantu
mb_strrchr()
.
V další lekci, Vyhledávání textových řetězců v PHP II. část, si ukážeme další funkce pro vyhledávání textových řetězců.