Podívejme se dnes na základní přehled funkcí, které se vám můžou hodit a jsou prakticky denně použitelné. Povětšinou je lze obejít vlastním kódem, a právě proto je dobré je znát, abychom neprogramovali nové „kolo“. Dnes se bude vše točit kolem řetězců, což je problematika, která je na programu každý den.
Měříme a vybíráme
Kdykoliv budete pracovat s řetězci, určitě budete potřebovat
minimálně funkci strlen()
,
která vám zjistí délku řetězce. Díky ní už můžete testovat, zda
zadaný vstup z formuláře má minimální délku, či jestli nepřesahuje
povolené limity. Pokud k proměnné chcete přidat nějaký text, není
problém jej připojit pomocí tečky. Odebrání některé části je ale
komplikovanější. Základní funkcí pro tuto operaci je substr($string, $start,
$length)
, která ze $string
vybere text od
$start
, délky $length
. Zajímavostí je, že můžete
$start
zadat i záporný a pak se počítá odzadu. To samé platí
i pro $length
.
$string = "Hi there! Merry Christmas.";
$new = substr($string, 10);
echo $new; // Merry Christmas.
Procházíme
Jak je vidět, 10 nám říká, že máme vybírat od 10. znaku. Z toho
jasně plyne, že jednotlivé znaky jsou očíslovány. Tuto vlastnost můžeme
jednoduše využít a procházet řetězec jako pole. Pokud si k tomu ještě
přihodíme funkce chr()
a ord()
, které převádějí znak
na jeho ASCII číslo, respektive naopak, pak máme celkem dobrý základ pro
sestavení Caesarovy šifry.
$string = "Zasifruj me";
for ($i = 0, $to = strlen($string); $i < $to; $i++) {
$string[$i] = chr(ord($string[$i]) + 5);
}
echo $string; // _fxnkwzo%rj
Toto vše používáme tehdy, když víme, kde chceme dané operace
provádět. Pokud se nám ale něco v textu „skrývá“, musíme to nejprve
najít. K tomu poslouží funkce strpos($string, $searched)
,
která vrátí index začátku výskytu $searched
v proměnné
$string
. Pokud se nic nenajde, vrací false
.
$text = "Tady se ještě nic nevezme ... START A odtud bude už všechno vidět!!! END Teda, skoro všechno";
$start = strpos($text, 'START') + 6; // přičteme délku startu + jednu mezeru
$end = strpos($text, 'END');
$length = $end - $start;
if ($start !== false && $end !== false)
echo substr($text, $start, $length);
else
echo 'V textu není vyznačen start a end.';
Jak vidíte, práce s textem už začíná být vcelku zajímavá.
Funkce str_pad()
vám
prodlouží řetězec do požadované délky. To se hodí, zvlášť pokud
chcete generovat nějakou fakturu. Můžete si vybrat, které znaky chcete
přidávat a kam - jestli na začátek, nebo na konec.
$input = "jedentisícstopadesátosm";
echo str_pad($input, 30, "-", STR_PAD_LEFT); // -----jedentisícstopadesátosm
Ošetřujeme
Již jsme si zmínili, že pro kontrolu délky vstupu lze použít funkci
strlen()
. S tím si ale nikdy nevystačíme. A i kdyby nám
stačila pouze kontrola délky vstupu, tak i přesto nás může nepřítel
jednoduše obelstít. Stačí, aby zadal pár mezer – bílých znaků. Bílé
znaky - pro toho, kdo neví - jsou všechny „netisknutelné znaky“:
mezery, tvrdé mezery, tabulátory, odřádkování atp. Můžeme se jich
krásně zbavit pomocí funkce trim()
.
$input = "Ošizená délka vstupu. ";
echo strlen($input); // 36
echo "<br />";
$input = trim($input);
echo strlen($input); // 24
Ve výchozím nastavení trim odstraňuje ony bílé znaky. Ale může se
nám hodit, že chceme z konce a ze začátku řetězce odstranit i jiné
znaky než bílé. Například lomítka. K tomu má funkce ještě druhý parametr, kam zadáme výčet jednotlivých znaků. Tato funkce existuje
ještě ve variantách rtrim()
, ltrim()
– rozdíl je v tom,
že odstraňují znaky pouze z jedné strany.
Často potřebujeme posoudit vstup podle komplexnějšího pravidla. K tomu používáme takzvané regulární výrazy. Regulární výraz je sekvence znaků popisující požadovaný řetězec. Některé znaky mají samozřejmě zvláštní význam, a tak nám vznikne regulár, který je obecný a přitom dostatečně popisuje formát vstupu. Perfektním webem v češtině je například regularnivyrazy.info. Zde můžete najít jednoduché příklady a kvalitní přehled významu jednotlivých znaků.
V PHP používejte Perl compatible regulární výrazy! Jsou o mnoho
rychlejší než posix regulární výrazy a také toho zvládnou více.
Základní funkcí je preg_match
, která zjistí,
zda daný řetězec vyhovuje reguláru.
V tomto příkladě chceme, aby uživatel zadal své telefonní číslo. Ale nevadí nám, když v něm uvede mezery. Proto jsme sestrojili regulární výraz, který nám vstup zkontroluje. (Zakomentujte inputy, které nechcete kontrolovat, a postupně si je pak vyzkoušejte.)
$input = "6027411"; // neprojde
$input = "602741147" // projde
$input = "602 741 147"; // projde
if (preg_match('#\d{3} ?\d{3} ?\d{3}#', $input))
echo "zadný text je správné telefonní číslo";
Skvělý seriál o regulárních výrazech naleznete také na Intervalu.
Když vypisujete nějaký text od uživatele a nemáte ho ošetřený od
znaků, které by vám mohly zamíchat v HTML, použijete funkci htmlspecialchars()
,
která převede různé šipečky ve jménech uživatelů na
odpovídající HTML entity.
$nick = "<<HRACH>>";
echo "<h1>", htmlspecialchars($nick), "</h1>";
Uživateli často také nabízíte možnost vložit nějaký delší text
pomocí textarea. Jenže, když tento text vypíšete, jsou zadaná
odřádkování ta tam. Proto máme funkci nl2br()
, která nahradí konce
řádků tagy br
.
Zvětšujeme, zmenšujeme
Na závěr dnešního dílu si uvedeme funkce pro zvětšování a
zmenšování písmen. Základem je strtolower()
a strtoupper()
– převede
celý text na malá písmena, respektive na velká. Funkce ucfirst()
převede první
písmeno na velké. Paralelou k ní je funkce lcfirst()
, která převede
první písmeno na malé. Bohužel, funkce lcfirst()
bude dostupná
zřejmě až v pozdějších vydáních PHP, a tak nám nezbývá, než si ji
vytvořit sami.
if (function_exists('lcfirst') === false) {
function lcfirst($string) {
$string[0] = strtolower($string[0]);
return $string;
}
}
Poslední zajímavou funkcí je ucwords()
, která převede
všechna první písmena slov na velká.
Doufám, že se vám dnešní článek líbil, v případě spokojenosti a zájmu by mohlo vyjít další pokračování zaměřené na jinou tématickou oblast v PHP. K tomu se můžete vyjádřit v komentářích.