Práce s řetězci v PHP

Většinu informací, které získáváme od uživatele webové aplikace, lze klasifikovat jako textové řetězce. A nejen od uživatele, ale v podstatě z jakéhokoliv zdroje máme možnost získávat informace v podobě textů. Zatím bychom měli vědět, že řetězce je možné spojovat pomocí operátoru ".", stejně tak znát rozdíl mezi jednoduchými a dvojitými uvozovkami. (event. viz Základní syntaxe PHP)

Podívejme se tedy na přehled dalších funkcí, které nám umožní provádět s řetězci také sofistikovanější operace.

trim

Pokud budeme provádět kontroly formulářových polí, jednou z nejčastějších operací bude odstranění mezer a dalších "prázdných" znaků (mezery, tabulátory, zalomení řádky...) ze začátku a z konce zadaného řetězce. K tomuto účelu lze využít funkci trim, které jako první parametr zadáme řetězec, který chceme upravovat. Jako volitelný druhý parametr můžeme zadat znaky, které se mají odstraňovat (tedy například také tečku etc.)

$str = trim($str); //odstraní prázdné znaky z konců řetězce

$str2=trim($str,"\n\r\t ;x"); //odstraní nové řádky,tabulátory, mezery, středníky a písmeno x

$str3 = trim($binary, "\x00..\x1F"); //odstraní znaky s binárním kódem 0-31 (včetně)

Pokud nebudeme chtít odstranění provádět z obou stran, ale pouze jednostranně, lze totožným způsobem využít funkce ltrim či rtrim.

strlen

Další častou kontrolou vstupních dat je kontrola délky zadaného řetězce, či kontrola, zda řetězec obsahuje konkrétní podřetězec. Pro zjištění délky řetězce můžeme využít funkci strlen.

Funkce má jediný parametr, kterým je zkoumaný řetězec.

$delka = strlen("ahoj"); //v proměnné $delka bude hodnota 4

strpos

Funkce strpos slouží ke zjištění umístění zadaného podřetězce v řetězci. U této funkce si musíme dát pozor na to, že může vracet jak hodnotu 0, tak hodnotu false, přičemž každá z těchto hodnot vyjadřuje něco jiného!

Hodnota 0 nám označuje, že podřetězec se nachází v řetězci hned na začátku (nejsou před ním žádné jiné znaky), hodnota false je vrácena v situaci, kdy daný podřetězec vůbec nebyl nalezen. Pro porovnávání výsledku této funkce je nutné používat operátor ===, event. !==.

strpos ($haystack, $needle [, $offset])

Parametry:

$haystack řetězec, který chceme prohledávat
$needle co chceme najít (pokud nezadáme řetězec, bude proměnná převedená na integer, který bude binární hodnotou hledaného znaku
$offset volitelný parametr - počet znaků od začátku prohledávaného řetězce, který se má přeskočit

 

substr

Funkce substr nám umožňuje získat z řetězce jeho konkrétní část, jejíž pozici určíme pomocí pozice od začátku řetězce a délky. Funkce poté vrací podřetězec jako svoji návratovou hodnotu.

substr ($string, $start [, $length])

Parametry:

$string zdrojový řetězec
$start od kterého znaku chceme začít podřetězec
$length délka podřetězce, který chceme vrátit (pokud nezadáme, je vráceno vše až do konce původního řetězce)

 

Příklad:

echo substr("abcdefgh",0,3); //vypíše 'abc'

str_replace

Často budeme při své práci potřebovat nejen řetězce prohledávat, ale také mít možnost vyměnit jejich konkrétní část za řetězec jiný, případně ji úplně vypustit. K oběma těmto účelům se hodí funkce str_replace.

U této funkce si musíme oproti funkci strpos dát pozor na pořadí parametrů (obecně lze říci, že funkce str* mají oproti funkcím str_* prohozené parametry). Konkrétně zadáváme:

str_replace ($search, $replace, $subject [,int $count])
$search co chceme najít
$replace čím to chceme nahradit
$subject řetězec, se kterým chceme pracovat (který chceme upravit)
$count lze zadat proměnnou, do které se uloží počet provedených nahrazení

 

Příklad:

echo str_replace("jmeno", "Pepo", "Ahoj jmeno"); //vypíše 'Ahoj Pepo'

Nahrazení samozřejmě může být v jednom řetězci více. Navíc lze s výhodou využít toho, že hledaná a nahrazovaná část nemusí být stejné délky - tj. lze tímto způsobem i část řetězce smazat.

 

Tip na procvičení:

Pokuste se upravit vstup od uživatele zadaný prostřednictvím textarea tak, aby všechny URL, které zadal, byly aktivními odkazy v HTML. Pro jejich vyhledání a nahrazení byste si měli stačit s výše uvedenými funkcemi.

 

Podívejme se dále na základní upravovací funkce - změnu velikosti znaků, html entity atd.

strtolower, strtoupper

Funkce umožňující převést řetězec na malá či velká písmena. Mají jediný parametr, kterým je upravovaný řetězec.

echo strtolower('aBc'); //vypíše abc

echo strtoupper('aBc'); //vypíše ABC

ucfirst, ucwords

Měnit velikost písmen však nemusíme chtít globálně pro celý řetězec, ale například jen pro první písmeno zadaného řetězce. V tom případě můžeme využít funkce ucfirst(pro první písmeno velké) či ucwords (pro velké první písmeno u každého slova).

strip_tags

U uživatelského vstupu bychom měli ve většině případů ošetřovat také možnost, že nám uživatel (ať už lidský, nebo nějaký robot) bude chtít na stránky například v podobě komentáře zadat nějaký HTML kód. Pokud budeme tuto možnost poskytovat neomezeně, možná nám to jen rozhodí layout stránek, ale není až takový problém ani to, aby uživatel vložil do komentáře javascript zajišťující automatické přesměrování na jeho vlastní web.

Nejjednodušší úpravou vstupních řetězce je v tomto případě odstranění HTML značek, k čemuž lze využít funkci strip_tags. Jako první parametr zadáváme této funkci řetězec, který chceme upravit, jako druhý lze zadat seznam tagů, které se mají v textu ponechat (lze uvažovat o strong atp.). Více viz manuál.

$upravene = strip_tags($retezec,'<em><strong>');

htmlspecialchars

Další úpravou může být převod speciálních HTML znaků na jejich entity. Může jít o znaky <,>,& a uvozovky.

$upravene = htmlspecialchars($retezec);

Funkci htmlspecialchars lze zadat celou řadu parametrů, ale v praxi použijeme možná druhý z nich, který nám umožňuje ovlivnit způsob kódování entit.

addslashes, stripslashes

Funkce addslashes a stripslashes nám slouží k přidání, respektive odebrání zpětných lomítek před znaky, které za normálních okolností vyžadují backslashování.

explode

Funkce explode umožňuje rozdělit řetězec na jednotlivé části dle zadaného oddělovače. Tato funkčnost se nám může hodit při rozdělování věty na jednotlivá slova, csv záznamů atd.

explode($delimiter, $string, $limit)
$delimiter oddělovač jednotlivých částí
$string řetězec, který chceme rozdělit
$limit

možné ovlivnění počtu prvků
kladné číslo - maximální počet částí, na které chceme řetězec rozdělit (poslední část obsahuje celý zbytek řetězce)
0 = neomezený počet částí
záporné číslo - funkce vrátí všechny části až na posledních (limit)

 

$arr = explode (',', "a,b,c"); //vytvoří pole s hodnotami a, b, c

implode / join

Funkce implode slouží k přesně opačnému účelu, než explode. Jako parametry jí předáváme spojovací řetězec a pole, které chceme spojit. Funkce poté spojí jednotlivé hodnoty z pole přes spojovací řetězec.

echo implode(', ',$lide);

Funkce join je aliasem funkce implode - její funkčnost je tedy totožná.

strrev

Funkce zajišťující otočení pořadů dat v řetězci.

$result = strrev($str);

chr

Funkce chr slouží k vytvoření znaku na základě jeho ascii hodnoty.

 

Kódování URL

Jak jistě víte, v URL adresách jsou speciální znaky (nealfanumerické znaky mimo - a _) zakódovány pomocí svých zástupných hexa-kódů, mezera je zakódovaná jako +.

Pro zakódování/dekódování lze používat funkce urlencode, urldecode, rawurlencode, rawurldecode.

Jako parametr jim vždy předáváme řetězec, který chceme přeformátovat.

 

Změna kódování řetězce - iconv

Při zpracování textů z různých zdrojů jsme stále ještě vystavováni nutnosti řešit kódování, ve kterém jsou texty uloženy. Pro převod lze využívat funkci iconv, které jako parametry zadáme postupně vstupní a výstupní kódování a řetězec, který chceme upravit. Pro vstupní i výstupní kódování používáme řetězce označující dané kódování, přičemž u výstupního lze ovlivnit, jak se má zacházet se znaky, které nelze převést (protože ve výstupním kódování jednoduše nejsou). Pro toto ovlivnění slouží modifikátory //TRANSLIT a //IGNORE (v prvním případě dojde k jejich přepisu do textové podoby, ve druhém k jejich vypuštění).

Funkce iconv vrací jako svoji výstupní hodnotu převedený řetězec, v případě chyby poté hodnotu false.

echo iconv("UTF-8", "ISO-8859-2//TRANSLIT", "10 €"); //vypíše 10 EUR
echo iconv("UTF-8", "ISO-8859-2//IGNORE", "10 €"); //vypíše 10

Označení pro běžná kódování přo češtinu jsou UTF-8, ISO-8859-2 a cp1250.

 

Multi-bytové kódování

Při práci s řetězci v PHP můžeme narážet na problémy při používání funkce substr (a některých dalších) v případě, že upravujeme řetězce v multi-bytovém kódování, kterým je pro nás typicky UTF-8. Problém je sice postupně odstraňován, ale záleží to na verzi PHP, kterou aktuálně používáme.

V případě výskytu problémů je možné klasické funkce pracující s řetězci nahradit funkcemi téměř totožnými, které ale mají ve svém názvu předponu mb_, tedy například mb_substr. Těmto funkcím navíc lze zadat jako jejich poslední atribut kódování, ve kterém je daný řetězec.