4. Řetězce v PHP

Řetězce jsou vlastně „kousky textu“. Nebo-li mohou obsahovat cokoliv.

Pro vypsání nějakého textu (řetězce) používáme nejčastěji příkaz echo a to třemi způsoby:

  1. řetězec uzavřený do jednoduchých uvozovek – apostrofů
  2. řetězec uzavřený do dvojitých uvozovek
  3. použít tzv. syntaxi heredoc v případě dlouhých textů

První způsob (apostrofy):

<?php
echo 'Toto je příklad řetězce.';
?>

Druhý způsob (uvozovky):

<?php 
echo "Toto je příklad řetězce.";
?>

Důležité rozdíly mezi těmito dvěma způsoby zápisu jsou:

  • do uvozovek můžeme psát jméno proměnné (viz dále) přímo.
  • do apostrofů musíme proměnnou zapsat tak, že ji "obalíme" tečkami (tzn. konkadence):
    <?php
    $body = 15;
    echo 'Pro získání oprávnění musíte mít ' .$body. ' bodů.';
    ?> ​
  • do uvozovek se dají psát speciální znaky jako je např. \n - odřádkování nebo \t - tabulátor a další (POZOR, prohlížeče neznají konstrukci \n, a tak nový řádek vidíme pouze ve zdrojovém kódu).
  • do uvozovek můžeme psát i další uvozovky, ale musí použít tzv. escape sekvenci (viz níže). Použití uvozovek se tím pádem méně hodí na výpis HTML kódu, protože je složitější.

Třetí způsob: V případě, že potřebujete vypsat delší text, můžete použít tzv. syntaxi heredoc. Syntaxe heredoc začíná trojicí znaků <<<, za kterou následuje nějaký text nazývaný identifikátor (v našem případě MMM). Stejný identifikátor musíme použít na ukončení takovéhoto řetězce. Za úvodním identifikátorem nesmí  začínat text. Ten musí být umístěn na novém řádku. Ukončovací identifikátor musí být na samostatném řádku, před ním nesmí být ani mezera, za ním musí být středník a nesmí se objevit v daném „dlouhém“ textu.

<?php
$text = <<<MMM
Toto je příklad dlouhého řetězce na
více řádků v heredoc syntaxi. Mohou to být
dlouhé věty..... Lorem ipsum dolor sit amet
Consectetuer lobortis lorem amet rutrum
Non Aenean Ut pellentesque condimentum
Accumsan laoreet ut turpis elit
Augue vitae Duis nec Nunc
Eget elit feugiat quis Ut
Vitae lobortis faucibus Aliquam wisi
Nam Donec sociis dictum commodo
Pede feugiat amet convallis metus
Tincidunt parturient quam pretium sapien
Nullam lorem libero vestibulum risus
Et metus sed purus nec
dipiscing est laoreet consectetuer enim
Id sed diam tellus ipsum
MMM;
echo $text;
?>

Escape sekvence

Pokud do textu potřebujete zapsat uvozovky či apostrof, musíte před takovýto znak vložit tzv. escape sekvenci:

<?php
echo "Tady bude uvozovka \" a text dále pokračuje.";
// Vypíše: Tady bude uvozovka " a text dále pokračuje
?>

PHP v tomto případě ví, že pokud se před uvozovkami či před apostrofem nachází zpětné lomítko, nekončí řetězec, ale je třeba následný znak vypsat. Pozn.: o escape sekvencích bude dále ještě zmíňka

Psaní HTML tagů do řetězců

V rámci psaní textových řetězců je možné také přímo do tohoto textu začlenit i jakékoliv HTML a CSS tagy. Příklad:

<?php 
echo 'Tady bude <span style="color: red;">červený text</span>.
<br>
Další text na novém řádku.';
?>

Zjištění délky řetězce - strlen

V případě, že potřebujeme zjistit délku řetězce (počet znaků) využívá PHP k této operaci funkci strlen, v případě kódování UTF-8 v kombinaci s diakritikou se používá mb_strlen:

<?php
echo mb_strlen('Řidič');
// Vypíše se číslo 5, protože slovo Řidič má 5 znaků
?>

Za funkcí strlen jsou v závorkách předány tzv. parametry funkce. V tomto případě je to pouze řetězec 'ahoj'. Zápis funkce se odborně nazývá volání funkce. Výsledkem je vypsání čísla 4, jinak řečeno funkce vrací hodnotu. Funkci strlen můžeme využít i pro vypsání délky řetězce, pocházejícího z proměnné:

<?php
$a = 'Miloslav Boudný';
// Přiřazení řetězce do proměnné a.
echo mb_strlen($a);
// Vypíše délku řetězce v proměnné $a, tedy číslo 15.
?>

Odstranění bílých mezer - trim

Další praktickou vestavěnou funkcí je trim. Funkce trim odstraní tzv. bílé znaky ze začátku a z konce řetězce. Za bílé znaky jsou považovány mezery, tabulátory, konce řádků a další znaky. Lze využít např. u zadávání textových polí do formuláře a jejich kontrolu. Defaultně funkce trim odstraní tyto znaky:

  • (ASCII 32 (0x20)), obyčejná mezera.
  • (ASCII 9 (0x09)), tabulátor.
  • (ASCII 10 (0x0A)), nová řádka (line feed).
  • (ASCII 13 (0x0D)), návrat vozíku (carriage return).
  • (ASCII 0 (0x00)), znak NUL.
  • "x0B" (ASCII 11 (0x0B)), vertikální tabulátor.

Malá ukázka:

<?php
$text1 = " Karel ";
$text2 = "      Svoboda  ";
echo "Vaše jméno a příjmení je ".$text1." ".$text2;
echo "<br>";
echo "Vaše jméno a příjmení je ".trim($text1)." ".trim($text2);
// Je třeba si zobrazit zdrojový kód, jinak neuvidíte rozdíl.
?>

Funkce trim má také možnost zadání parametru V následujícím příkladu je např. odstraněno písmeno K a S. Jedná se o znaky, které musí být na začátku.

<?php
$text1 = "Karel";
$text2 = "Svoboda";
echo "Vaše jméno a příjmení je ".trim($text1,"K")." ".trim($text2,"S");
?>

Více informací k funkci trim Příbuzné funkce:

  • ltrim() - odstraní bílé mezery zleva
  • rtrim() - odstraní bílé mezery zprava

Získání části řetězce - substr

Další často používanou funkcí je funkce SubStr. Ta slouží k získání části řetězce. Má 3 parametry – řetězec, pozici 1. znaku a délku (oddělené čárkou): substr($řetězec, pozice 1. znaku, délka) Vrací část řetězce určené délky od daného znaku. Pokud je pozice 1. znaku záporné číslo, bude se pozice počítat od konce. Pokud je záporná délka, bude řetězec tolik znaků od konce končit. Není-li délka vůbec zadána, funkce vrátí vše od prvního znaku do konce řetězce. Tady je několik příkladů:

<?php
$text = "Caste hrani pocitacovach her nici krcni pater.";
echo substr($text, 6)."<br>"; // vrací znaky od 6 pozice - hrani pocitacovach her nici krcni pater.
echo substr($text, -6)."<br>"; // vrací znaky od 6 pozice zleva (od konce)- pater.
echo substr($text, 6, 5)."<br>"; // vrací znaky od 6. pozice v počtu 5 dalších znaků - hrani
echo substr($text, 6, -12)."<br>"; // vrací znaky od 6. pozice a z tohoto ještě odstaní 12 znaků od konce - hrani pocitacovach her nici
echo substr($text, -6, 5)."<br>"; // vrací znaky od 6 pozice od konce v počtu 5 znaků - pater
echo substr($text, -6, -3)."<br>"; // vrací znaky od 6 pozice od konce a poslední 3 znaky ještě taky odstraní - pat
?>

Nahrazení textového řetězce - str_replace

Asi nejpoužívanější funkcí je pak funkce str_replace. Obsahuje tři parametry – CO nahradit, ČÍM nahradit, KDE nahradit (oddělené čárkou): str_replace('CO','ČÍM','KDE'); Příklad:

<?php
$text = str_replace('ing.','Ing.', 'Tituly magistr - Mgr. a inženýr - ing. jsou na stejné úrovni. Píšou se vždy s velkým písmenem. Dříve se titul inženýr psal malými písmeny.');
echo $text;
// pokud se v textu objeví "ing.", nahradí se textem "Ing.".
?>

Zjištění pozice textu - strpos

Další podobnou funkcí je pak funkce strpos (pro UTF-8 opět s prefixem mb_). Jedná se o zjištění pozice, na které se nachází hledaný text, přesněji řečeno za kterou začíná hledaný text: strpos($text, "Hledaný text");

<?php
$text = "Není to PHP výborný jazyk?";
echo (mb_strpos($text, "PHP"));
// vrací hodnotu 8 - pozice, za kterou začíná text "PHP"
?>

Počítají se samozřejmě i mezery.

Pozor na diakritiku!

Pozor na diakritické znaky. Minimálně u funkcí strlen a strpos není tzv. "multibyte safe", což znamená, že "neumí" počítat diakritické znaky správně. Proto se používá jejich novější podoba - mb_strlen, mb_strpos, která již tuto diakritiku počítá správně. Více o Multibyte Safe.