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.