6. diel - Tagy v textovom reťazci
V predchádzajúcej lekcii, Nahradzovanie textových reťazcov , sme si vysvetlili, ako nahrádzať textové reťazce pomocou PHP funkcií.
V tejto lekcii kurze PHP funkcií si vymenujeme a detailne popíšeme funkcie pre prácu so značkami (tagy), ich odstraňovaní a konvertovanie.
Môžeme sa dostať do situácie, kedy sa v našom textovom reťazci
potrebujeme zbaviť nechcených tagov a alebo ich zobraziť tak, aby sa
neprekladali do HTML, XML či
PHP. Tiež nechcená spätné lomítka nám môžu v našom
kóde urobiť peknú neplechu. Funkcie, ktoré si tu popíšeme, nám uľahčí
prácu s dlhým vyhľadávaním a prepisovaním tagov alebo nevhodne
umiestnených spätných lomítok. Napríklad funkcia
htmlspecialchars() je hojne využívaná ako obrana proti
útoku XSS a iných. Je dobré teda aspoň túto funkciu
poznať:)
strip_tags()
V PHP je funkcia, ktorá nám z textového reťazca jednoducho odstráni
HTML, PHP či XML tagy. Funkcia strip_tags() prijíma 2 parametre,
kde prvý z nich je textový reťazec a druhý je tag, ktorý sa môže v
textovom reťazci vyskytovať a nebude zmazaný, nie je však povinný. Príklad
funkcie strip_tags():
$text = "Toto je <a href='www.google.cz'><h1>Nadpis</h1></a> první úrovně"; print(strip_tags($text));
V textovom reťazci sú odstránené všetky HTML tagy a na stránke bude vypísaný text bez tagov:
Avšak ak pridáme do druhého parametru niektoré HTML tagy, nebudú odstránené:
$text = "Toto je <a href='www.google.cz'><h1>Nadpis</h1></a> první úrovně"; print(strip_tags($text, '<h1>'));
Teraz sme do funkcie strip_tags() pridali tag nadpisu prvej
úrovne. Tento tag sa neodstráni a bude viditeľný na stránke. Druhý tag
<a> v našom textovom reťazci ale odstránený bude:
Od verzie PHP 7.4.0 možno tagy u druhého parametru zapisovať do hranatých zátvoriek, výstup na stránku bude rovnaký:
$text = "Toto je <a href='test'><h1>Nadpis</h1></a> první úrovně"; print(strip_tags($text, ['h1', 'a']));
Ak by sme chceli odstrániť viac tagov naraz a nemáme PHP verzii 7.4.0, môžeme viac tagov odstrániť takto:
$text = "Toto je <a href='test'><h1>Nadpis</h1></a> první úrovně"; print(strip_tags($text, '<h1><a>'));
Výstup bude rovnaký ako predchádzajúci príklad.
stripslashes()
Funkcia stripslashes() odstraňuje spätné lomítka
\ iu špeciálnych znakov napríklad \n. Odstraňuje
tiež znaky pridanej funkcií addslashes(). Funkcia prijíma iba
jeden parameter, ktorým je náš textový reťazec:
$text = "Programovací jazyk \PHP \n je úžasný!"; print(stripslashes($text));
Spätné lomítka sú odstránené, pretože náš textový reťazec je
napísaný v úvodzovkách "", bude špeciálny znak
\n vykonaný a lomka nebude odstránené. Výstup na stránke
bude:
Špeciálny znak \n sa vykonal, avšak nový riadok sa
väčšinou vytvorí iba v konzole. Keď si teda súbor spustíme v konzole
pomocou PHP, budeme mať tento výstup:
C:\wamp\www> php .\stripslashes.php Programovací jazyk PHP je úžasný!
Ak zapíšeme textový reťazec do apostrofov '', spätné
lomítko u špeciálneho znaku \n bude odstránené:
$text = 'Programovací jazyk \PHP \n je úžasný!'; print(stripslashes($text));
Na stránke uvidíme:
stripcslashes()
Je podobná funkcii stripslashes(). Odstraňuje spätné
lomítka \. Rozdielom je, že pri špeciálnych znakov, napríklad
\n, lomítko neodstráni a znak bude vykonaný. Odstraňuje tiež
znaky pridanej funkcií addcslashes(). Funkcia prijíma iba jeden
parameter, ktorým je náš textový reťazec:
$text = 'Programujeme\ v jazyce \n PHP'; print(stripcslashes($text));
Spätná lomítka v texte budú odstránené, výnimkou sú však špeciálne
znaky \n ktoré sa vykonajú:
Na stránke nový riadok zase pravdepodobne neuvidíme, v konzole by ale veta bolo odriadkovanie takto:
Programujeme v jazyce PHP
htmlspecialchars()
Prepočíta špeciálne znaky na HTML entity. Tagy teda nebudú preložené
do HTML, ale budú zobrazené ako klasický text. Napríklad typický HTML tag
pre tučný štýl písma <b> bude prevedený pomocou HTML
entít a na stránke zobrazený ako text:
$text = 'Tento text má být zobrazen <b>tučně</b>'; print(htmlspecialchars($text));
Výsledkom na stránke bude:
Avšak časť textu zobrazená tučne nie je. Tagy <b> a
</b> sú preložené ako HTML entity
<b> a </b>, Teda ich
vlastnosť bude vynechaná.
Prekladá iba určité znaky, ktoré sú zapísané v tabuľke:
| znak | preklad |
|---|---|
& - ampersand |
& |
" - úvodzovky |
", Pokiaľ nie je stanovená vlajka
ENT_NOQUOTES |
' - apostrof |
', Iba ak je stanovená vlajka
ENT_QUOTES |
< - menšie ako |
< |
> - väčší ako |
> |
htmlspecialchars() prijíma okrem nášho textového
reťazca ešte ďalšie 3 parametre. Druhým parametrom sú
tzv. Vlajky (flags), ktoré určujú, ako zaobchádzať s
úvodzovkami, neplatným kódovaním a použitým typom dokumentu. Pre
zaobchádzanie s úvodzovkami tu existujú tieto flagy:
| vlajka | popis |
|---|---|
ENT_COMPAT |
Nepreloží apostrofy, úvodzovky áno |
ENT_QUOTES |
Preloží úvodzovky a apostrofy |
ENT_NOQUOTES |
Nepreloží úvodzovky a apostrof |
Uveďme si príklad:
$text = "Pavel & Jana jsou 'dobří' přátelé"; print(htmlspecialchars($text, ENT_COMPAT)); echo "<br>"; // všimněte si uvozovek $text = 'Pavel & Jana jsou "dobří" přátelé'; print(htmlspecialchars($text, ENT_COMPAT));
Flag ENT_COMPAT úvodzovky a iné špeciálne znaky alebo tagy
preloží ako HTML entity, apostrofy však preložené nebudú. Po zobrazení
zdrojového kódu stránky uvidíme teda tieto dve vety:
Pavel & Jana jsou 'dobří' přátelé Pavel & Jana jsou "dobří" přátelé
Flag ENT_QUOTES preloží všetky špeciálne znaky vrátane
úvodzoviek do HTML entít:
$text = "Pavel & Jana jsou 'dobří' přátelé"; print(htmlspecialchars($text, ENT_QUOTES));
V zdrojovom kóde stránky môžeme vidieť tento výsledok:
Pavel & Jana jsou 'dobří' přátelé Pavel & Jana jsou "dobří" přátelé
Flag ENT_NOQUOTES preloží všetko, okrem úvodzoviek a
apostrofov:
$text = "Pavel & Jana jsou 'dobří' přátelé"; print(htmlspecialchars($text, ENT_NOQUOTES));
Vo zdrojáky môžeme vidieť zachované apostrofy:
Pavel & Jana jsou 'dobří' přátelé
Tretí parameter špecifikuje kódovanie
(encoding) nášho textového reťazca. Defaultne je nastavené
kódovanie na UTF-8. Kódovanie funkcie
htmlspecialchars() môžeme zmeniť na ISO-8859-1
takto:
$text = 'Změna kódování na ISO-8859-1'; print(htmlspecialchars($text, ENT_COMPAT, "ISO-8859-1"));
Štvrtým parametrom je tzv. Dvojité kódovanie
(double encode). Defaultná hodnota true, teda sa
konvertujú všetky špeciálne znaky a tagy. Ak teda do nášho textového
reťazca vložíme HTML entitu, napríklad &, Nebude znova
preložená na znak znaku at &:
$text = 'Znak ampersandu & je zapsán jako HTML entita takto: &'; print(htmlspecialchars($text, ENT_COMPAT, "UTF-8", true)); // HTML entitu přeložíme dvakrát
Prvý ampersand v textovom reťazci je preložený na HTML entitu
& a na stránke ho môžeme vidieť ako znak
&. HTML entita & v našom textovom
reťazci je znova preložená a je zapísaná ako
&amp;:
Ak však pri štvrtom parametra zvolíme hodnotu
false, je prvý ampersand v textovom reťazci preložený úplne
rovnako, ako u prvého prípadu. Druhý ampersand zapísaný pomocou
HTML entity je však preložený na znak znaku at:
$text = 'Znak ampersandu & je zapsán jako HTML entita takto: &'; print(htmlspecialchars($text, ENT_COMPAT, "UTF-8", false)); // HTML entita bude zobrazena jako znak
Výsledkom bude:
Funkcia htmlspecialchars() prekladá iba znaky zo
zadanej tabuľky vyššie. Ak však chceme prekladať všetky HTML entity,
použijeme funkciu htmlentities(), ktorá prijíma rovnaké
parametre.
htmlspecialchars_decode()
Funkcia htmlspecialchars_decode() je obráteným spôsobom
funkcia htmlspecialchars(). Prepočíta HTML entity na špeciálne
znaky, ktoré môžu tvoriť jednotlivé tagy v HTML. Textový reťazec
napísaný pomocou HTML entít
<b>tučný text</b> je teda preložený
späť na špeciálne znaky <b>tučný text</b>. Tagy
<b> a </b> budú teda platné a textový
reťazec bude mať štýl tučného písma:
$text = "<b>tučný text</b>"; print(htmlspecialchars_decode($text));
Na stránke uvidíme:
HTML entity v textovom reťazci sú teda späť preložené (dekódované) na špeciálne znaky.
Funkcia htmlspecialchars_decode() ešte 2. parameter. Prvým z
nich je teda náš textový reťazec a druhým parametrom sú vlajky
(flags), ktoré sú úplne rovnaké ako pri funkcii
htmlspecialchars(). Ukážme si príklad s druhým parametrom:
$text = "<h1>Nadpis první úrovně</h1> a další 'text'"; print(htmlspecialchars_decode($text, ENT_COMPAT)); // HTML entity budou přeloženy jako uvozovky a jiné speciální znaky nebo tagy.
V prehliadači, pri zobrazení zdrojového kódu stránky, je textový reťazec napísaný takto:
<h1>Nadpis první úrovně</h1> a další 'text'
Na stránke inak klasicky uvidíme:
Podobnú funkcií k htmlspecialchars_decode() je
funkcia html_entity_decode(), avšak rovnako ako opačná funkcia
htmlentities() prekladá všetky ostatné znaky, zatiaľ čo
htmlspecialchars_decode() je obmedzená rozsahom prekladaných
znakov.
V ďalšej lekcii, Vlastnosti textových reťazcov a práce s medzerami , si ukážeme, ako zistiť vlastnosti textových reťazcov a ako pracovať s medzerami pomocou funkcií v PHP.
