C týden
Tento týden až 80% sleva na e-learning týkající se jazyka C
50 % bodů zdarma na online výuku díky naší Slevové akci!

Lekce 6 - Tagy v textovém řetězci

V předchozí lekci, Nahrazování textových řetězců, jsme si vysvětlili, jak nahrazovat textové řetězce pomocí PHP funkcí.

V této lekci kurzu PHP funkcí si vyjmenujeme a detailně popíšeme funkce pro práci se značkami (tagy), jejich odstraňování a konvertování.

Můžeme se dostat do situace, kdy se v našem textovém řetězci potřebujeme zbavit nechtěných tagů a nebo je zobrazit tak, aby se nepřekládaly do HTML, XML či PHP. Také nechtěná zpětná lomítka nám mohou v našem kódu udělat pěknou neplechu. Funkce, které si zde popíšeme, nám usnadní práci s dlouhým vyhledáváním a přepisováním tagů nebo nevhodně umístěných zpětných lomítek. Například funkce htmlspecialchars() je hojně využívaná jako obrana proti útoku XSS a jiných. Je dobré tedy alespoň tuto funkci znát :)

strip_tags()

V PHP je funkce, která nám z textového řetězce jednoduše odstraní HTML, PHP či XML tagy. Funkce strip_tags() přijímá 2 parametry, kde první z nich je textový řetězec a druhý je tag, který se může v textovém řetězci vyskytovat a nebude smazán, není však povinný. Příklad funkce strip_tags():

$text = "Toto je <a href='www.google.cz'><h1>Nadpis</h1></a> první úrovně";
print(strip_tags($text));

V textovém řetězci jsou odstraněny všechny HTML tagy a na stránce bude vypsán text bez tagů:

Funkce strip_tags()
localhost

Avšak pokud přidáme do druhého parametru některé HTML tagy, nebudou odstraněny:

$text = "Toto je <a href='www.google.cz'><h1>Nadpis</h1></a> první úrovně";
print(strip_tags($text, '<h1>'));

Nyní jsme do funkce strip_tags() přidali tag nadpisu první úrovně. Tento tag se neodstraní a bude viditelný na stránce. Druhý tag <a> v našem textovém řetězci ale odstraněn bude:

Funkce strip_tags()
localhost

Od verze PHP 7.4.0 lze tagy u druhého parametru zapisovat do hranatých závorek, výstup na stránku bude stejný:

$text = "Toto je <a href='test'><h1>Nadpis</h1></a> první úrovně";
print(strip_tags($text, ['h1', 'a']));

Pokud bychom chtěli odstranit více tagů najednou a nemáme PHP verzi 7.4.0, můžeme více tagů odstranit takto:

$text = "Toto je <a href='test'><h1>Nadpis</h1></a> první úrovně";
print(strip_tags($text, '<h1><a>'));

Výstup bude stejný jako předchozí příklad.

stripslashes()

Funkce stripslashes() odstraňuje zpětná lomítka \ i u speciálních znaků například \n. Odstraňuje také znaky přidané funkcí addslashes(). Funkce přijímá pouze jeden parametr, kterým je náš textový řetězec:

$text = "Programovací jazyk \PHP \n je úžasný!";
print(stripslashes($text));

Zpětná lomítka jsou odstraněny, jelikož náš textový řetězec je napsaný v uvozovkách "", bude speciální znak \n proveden a lomítko nebude odstraněno. Výstup na stránce bude:

Funkce stripslashes()
localhost

Speciální znak \n se provedl, avšak nový řádek se většinou vytvoří pouze v konzoli. Když si tedy soubor spustíme v konzoli pomocí PHP, budeme mít tento výstup:

C:\wamp\www> php .\stripslashes.php
Programovací jazyk PHP
 je úžasný!

Pokud zapíšeme textový řetězec do apostrofů '', zpětné lomítko u speciálního znaku \n bude odstraněno:

$text = 'Programovací jazyk \PHP \n je úžasný!';
print(stripslashes($text));

Na stránce uvidíme:

Funkce stripslashes()
localhost

stripcslashes()

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Je podobná funkci stripslashes(). Odstraňuje zpětná lomítka \. Rozdílem je, že u speciálních znaků, například \n, lomítko neodstraní a znak bude proveden. Odstraňuje také znaky přidané funkcí addcslashes(). Funkce přijímá pouze jeden parametr, kterým je náš textový řetězec:

$text = 'Programujeme\ v jazyce \n PHP';
print(stripcslashes($text));

Zpětná lomítka v textu budou odstraněny, výjimkou jsou však speciální znaky \n které budou provedeny:

Funkce stripcslashes()
localhost

Na stránce nový řádek zase pravděpodobně neuvidíme, v konzoli by ale věta bylo odřádkována takto:

Programujeme v jazyce
 PHP

htmlspecialchars()

Konvertuje speciální znaky na HTML entity. Tagy tudíž nebudou přeloženy do HTML, ale budou zobrazeny jako klasický text. Například typický HTML tag pro tučný styl písma <b> bude konvertován pomocí HTML entit a na stránce zobrazen jako text:

$text = 'Tento text má být zobrazen <b>tučně</b>';
print(htmlspecialchars($text));

Výsledkem na stránce bude:

Funkce htmlspecialchars()
localhost

Avšak část textu zobrazena tučně není. Tagy <b> a </b> jsou přeloženy jako HTML entity &lt;b&gt; a &lt;/b&gt;, tudíž jejich vlastnost bude vynechána.

Překládá pouze určité znaky, které jsou zapsány v tabulce:

Znak Překlad
& - ampersand &amp;
" - uvozovka &quot;, pokud není stanovena vlajka ENT_NOQUOTES
' - apostrof &#039;, pouze pokud je stanovena vlajka ENT_QUOTES
< - menší než &lt;
> - větší než &gt;

Funkce htmlspecialchars() přijímá kromě našeho textového řetězce ještě další 3 parametry. Druhým parametrem jsou tzv. vlajky (flags), které určují, jak zacházet s uvozovkami, neplatným kódováním a použitým typem dokumentu. Pro zacházení s uvozovkami zde existují tyto flagy:

Vlajka Popis
ENT_COMPAT Nepřeloží apostrofy, uvozovky ano
ENT_QUOTES Přeloží uvozovky a apostrofy
ENT_NOQUOTES Nepřeloží uvozovky ani apostrofy

Flagů však existuje více, všechny si je ukazovat ale nebudeme.

Uveďme si pří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 uvozovky a jiné speciální znaky nebo tagy přeloží jako HTML entity, apostrofy však přeloženy nebudou. Po zobrazení zdrojového kódu stránky uvidíme tedy tyto dvě věty:

Pavel &amp; Jana jsou 'dobří' přátelé
Pavel &amp; Jana jsou &quot;dobří&quot; přátelé

Flag ENT_QUOTES přeloží všechny speciální znaky včetně uvozovek do HTML entit:

$text = "Pavel & Jana jsou 'dobří' přátelé";
print(htmlspecialchars($text, ENT_QUOTES));

Ve zdrojovém kódu stránky můžeme vidět tento výsledek:

Pavel &amp; Jana jsou &#039;dobří&#039; přátelé
Pavel &amp; Jana jsou &quot;dobří&quot; přátelé

Flag ENT_NOQUOTES přeloží všechno, kromě uvozovek a apostrofů:

$text = "Pavel & Jana jsou 'dobří' přátelé";
print(htmlspecialchars($text, ENT_NOQUOTES));

Ve zdrojáku můžeme vidět zachované apostrofy:

Pavel &amp; Jana jsou 'dobří' přátelé

Třetí parametr specifikuje kódování (encoding) našeho textového řetězce. Defaultně je nastavené kódování na UTF-8. Kódování funkce htmlspecialchars() můžeme změnit 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 parametrem je tzv. dvojité kódování (double encode). Defaultní hodnota je true, tudíž se konvertují všechny speciální znaky a tagy. Pokud tedy do našeho textového řetězce vložíme HTML entitu, například &amp;, nebude znova přeložena na znak ampersandu &:

$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

První ampersand v textovém řetězci je přeložen na HTML entitu &amp; a na stránce ho můžeme vidět jako znak &. HTML entita &amp; v našem textovém řetězci je znova přeložena a je zapsána jako &amp;amp;:

Funkce htmlspecialchars()
localhost

Pokud však u čtvrtého parametru zvolíme hodnotu false, je první ampersand v textovém řetězci přeložen úplně stejně, jako u prvního případu. Druhý ampersand zapsaný pomocí HTML entity je však přeložen na znak ampersandu:

$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ýsledkem bude:

Funkce htmlspecialchars()
localhost

Funkce htmlspecialchars() překládá pouze znaky ze zadané tabulky výše. Pokud však chceme překládat všechny HTML entity, použijeme funkci htmlentities(), která přijímá stejné parametry.

htmlspecialchars_decode()

Funkce htmlspecialchars_decode() je obráceným způsobem funkce htmlspecialchars(). Konvertuje HTML entity na speciální znaky, které mohou tvořit jednotlivé tagy v HTML. Textový řetězec napsaný pomocí HTML entit &lt;b&gt;tučný text&lt;/b&gt; je tedy přeložen zpět na speciální znaky <b>tučný text</b>. Tagy <b> a </b> budou tudíž platné a textový řetězec bude mít styl tučného písma:

$text = "&lt;b&gt;tučný text&lt;/b&gt;";
print(htmlspecialchars_decode($text));

Na stránce uvidíme:

Funkce htmlspecialchar­s_decode()
localhost

HTML entity v textovém řetězci jsou tedy zpět přeloženy (dekódovány) na speciální znaky.

Funkce htmlspecialchars_decode() ještě 2. parametr. Prvním z nich je tedy náš textový řetězec a druhým parametrem jsou vlajky (flags), které jsou úplně stejné jako u funkce htmlspecialchars(). Ukažme si příklad s druhým parametrem:

$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 prohlížeči, při zobrazení zdrojového kódu stránky, je textový řetězec napsán takto:

<h1>Nadpis první úrovně</h1> a další &#039;text&#039;

Na stránce jinak klasicky uvidíme:

Funkce htmlspecialchar­s_decode()
localhost

Podobnou funkcí k htmlspecialchars_decode() je funkce html_entity_decode(), avšak stejně jako opačná funkce htmlentities() překládá všechny ostatní znaky, zatímco htmlspecialchars_decode() je omezena rozsahem překládaných znaků.

V další lekci, Vlastnosti textových řetězců a práce s mezerami, si ukážeme, jak zjistit vlastnosti textových řetězců a jak pracovat s mezerami pomocí funkcí v PHP.


 

Předchozí článek
Nahrazování textových řetězců
Všechny články v sekci
PHP funkce
Článek pro vás napsal Pavel Vaněček
Avatar
Jak se ti líbí článek?
1 hlasů
Autor se věnuje psaní článků na Itnetwork.cz
Aktivity (5)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!