IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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:

Funkce strip_tags()
localhost

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:

Funkce strip_tags()
localhost

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:

Funkce stripslashes()
localhost

Š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:

Funkce stripslashes()
localhost

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ú:

Funkce stripcslashes()
localhost

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:

Funkce htmlspecialchars()
localhost

Avšak časť textu zobrazená tučne nie je. Tagy <b> a </b> sú preložené ako HTML entity &lt;b&gt; a &lt;/b&gt;, Teda ich vlastnosť bude vynechaná.

Prekladá iba určité znaky, ktoré sú zapísané v tabuľke:

znak preklad
& - ampersand &amp;
" - úvodzovky &quot;, Pokiaľ nie je stanovená vlajka ENT_NOQUOTES
' - apostrof &#039;, Iba ak je stanovená vlajka ENT_QUOTES
< - menšie ako &lt;
> - väčší ako &gt;
Funkcia 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
Flagov však existuje viac, všetky si ich ukazovať ale nebudeme.

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 &amp; Jana jsou 'dobří' přátelé
Pavel &amp; Jana jsou &quot;dobří&quot; 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 &amp; Jana jsou &#039;dobří&#039; přátelé
Pavel &amp; Jana jsou &quot;dobří&quot; 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 &amp; 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 &amp;, Nebude znova preložená na znak znaku at &:

$text = 'Znak ampersandu & je zapsán jako HTML entita takto: &amp;';
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 &amp; a na stránke ho môžeme vidieť ako znak &. HTML entita &amp; v našom textovom reťazci je znova preložená a je zapísaná ako &amp;amp;:

Funkce htmlspecialchars()
localhost

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: &amp;';
print(htmlspecialchars($text, ENT_COMPAT, "UTF-8", false)); // HTML entita bude zobrazena jako znak

Výsledkom bude:

Funkce htmlspecialchars()
localhost

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 &lt;b&gt;tučný text&lt;/b&gt; 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 = "&lt;b&gt;tučný text&lt;/b&gt;";
print(htmlspecialchars_decode($text));

Na stránke uvidíme:

Funkce htmlspecialchar­s_decode()
localhost

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 = "&#x3C;h1&#x3E;Nadpis první úrovně&#x3C;/h1&#x3E; a další &#039;text&#039;";
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ší &#039;text&#039;

Na stránke inak klasicky uvidíme:

Funkce htmlspecialchar­s_decode()
localhost

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.


 

Predchádzajúci článok
Nahradzovanie textových reťazcov
Všetky články v sekcii
PHP funkcie
Preskočiť článok
(neodporúčame)
Vlastnosti textových reťazcov a práce s medzerami
Článok pre vás napísal Pavel Vaněček
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje psaní článků na Itnetwork.cz
Aktivity