Lekce 17 - Fonetické funkce a kódování HTML entit v PHP
V minulé lekci, Hashování textových řetězců v PHP, jsme se dozvěděli, jak hashovat textové řetězce v PHP.
V dnešní lekci si ukážeme použití funkcí metaphone()
,
soundex()
, htmlentities()
a k ní i opačnou funkci
html_entity_decode()
.
metaphone()
Funkce metaphone()
vypočítá klíč textového řetězce.
Takový klíč nám ukazuje, jak by daný textový řetězec vyslovil anglicky
mluvící člověk. Metaphone je fonetický algoritmus pro
indexování slov s anglickou výslovností, řetězec je tedy zakódován do
již zmíněného klíče. Takový algoritmus lze použít pro různé aplikace
zabývající se například hláskováním. Metaphone je podobný fonetickému
algoritmu Soundex, avšak je více přesnější co se týče
pravidel anglické výslovnosti. Funkce přijímá celkem dva parametry, kde
prvním z nich je náš textový řetězec a druhým nepovinným parametrem je
specifikace délky klíče. Ukažme si příklad:
$str = "Programming is fun!"; echo metaphone($str);
Výstupem bude řetězec PRKRMNKSFN
, který když si zkusíme
přečíst co možná nejvíce anglicky, dostaneme výslovnost původního
řetězce.
$str = "Pronunciation"; $str1 = "Pronunciations"; echo metaphone($str, 7); echo "<br>"; echo metaphone($str1, 7);
Výstupem budou dva shodné řetězce PRNNXXN
a
PRNNXXN
. Omezili jsme totiž velikost klíče, tudíž druhý
klíč zní stejně jako první.
soundex()
Funkce soundex()
vypočítá stejně jako u funkce
metaphone()
klíč textového řetězce. Klíčem je čtyřmístný
alfanumerický řetězec, který představuje anglickou výslovnost slova.
Soundex je jeden z mnoha fonetických algoritmů a indexuje
slova s anglickou výslovností. Lze jej využít pro aplikace zabývající se
například hláskováním. Na rozdíl od předchozí funkce přijímá pouze
jeden parametr, kterým je náš textový řetězec. Ukažme si příklady:
$str = "Programming is fun!"; echo soundex($str);
Na stránce poté dostaneme řetězec P626
.
Algoritmus funkce soundex()
je následující:
- První písmeno je vždy zachováno. Výskyty písmen A, E, I, O, U, Y, H, W jsou vynechány, nemají tedy kód.
- Souhlásky (bez prvního písmene textového řetězce) jsou nahrazovány číslicemi podle této tabulky:
Písmena | Kód |
---|---|
B, F, P, V | 1 |
C, G, J, K, Q, S, X, Z | 2 |
D, T | 3 |
L | 4 |
M, N | 5 |
R | 6 |
- Pokud spolu v původním textovém řetězci (před krokem 1) sousedí dvě nebo více písmen se stejným kódem, je zachováno pouze první. Stejně tak, pokud jsou dvě písmena se stejným kódem odděleny písmeny H nebo W, jsou také kódovány pouze jednou číslicí. Oproti tomu dvě písmena se stejným kódem oddělené samohláskou jsou kódována dvěma číslicemi. Toto pravidlo se vztahuje také na první písmeno textového řetězce.
- Pokud je původní textový řetězec příliš krátký a algoritmus mu nepřiřadí alespoň tři číslice, je číselný kód do celkové délky tří doplněn nulami. Pokud má výsledný kód více než tři číslice, jsou zachovány pouze první tři.
htmlentities()
Je funkce, která nám převede některé HTML tagy nebo text na HTML entity.
Tato funkce je podobná funkci htmlspecialchars()
, kterou jsme si
představili v jedné z předchozích lekcí.
Funkce přijímá celkem čtyři parametry. Prvním parametrem je náš textový
řetězec obsahující HTML tagy, druhým parametrem jsou vlajky (flags), které
udávají, jak zpracovat uvozovky, kódování a jaký je použitý typ
dokumentu. Třetím parametrem je samotné kódování a posledním čtvrtým
parametrem je možnost zapnutí/vypnutí dvojitého kódování. Když je
dvojité kódování vypnuté, tak PHP nebude kódovat již existující HTML
entity podruhé. Ukažme si příklad:
<?php $str = "Kvadratická rovnice je vyjádřena předpisem: 'ax² + bx + c'"; echo htmlentities($str, ENT_COMPAT);
Pokud se na výsledek výstupu podíváme přes konzoli nebo v prohlížeči zobrazíme zdrojový kód, uvidíme tento řetězec zapsán jako:
Konzolová aplikace
Kvadratická rovnice je vyjádřena předpisem: ax² + bx + c
Druhý parametr funkce znamená pouze to, že v řetězci budou konvertovány
pouze uvozovky "
(flag ENT_COMPAT
).
<?php $str = "Kvadratická rovnice je vyjádřena předpisem: 'ax² + bx + c'"; echo htmlentities($str, ENT_QUOTES);
Avšak změnou druhého parametru na ENT_QUOTES
, který nám
zajistí převod uvozovek a apostrofů dostaneme do konzole:
Konzolová aplikace
Kvadratická rovnice je vyjádřena předpisem: 'ax² + bx + c'`
<?php $str = "Kvadratická rovnice je vyjádřena předpisem: 'ax² + bx + c'"; echo htmlentities($str, ENT_NOQUOTES);
Rozhodneme-li se nepřevádět žádné uvozovky nebo apostrofy, dostaneme do konzole:
Konzolová aplikace
Kvadratická rovnice je vyjádřena předpisem: 'ax² + bx + c'
Flag (vlajka, příznak) | Popis |
---|---|
ENT_COMPAT |
Převede dvojité uvozovky a jednoduché uvozovky ponechá na pokoji. |
ENT_QUOTES |
Převede dvojité i jednoduché uvozovky. |
ENT_NOQUOTES |
Dvojité i jednoduché uvozovky nebudou převedeny. |
ENT_IGNORE |
Zahodí neplatné sekvence kódových jednotek namísto vrácení prázdného řetězce. Používání tohoto flagu se nedoporučuje z bezpečnostních důvodů. |
ENT_SUBSTITUTE |
Nahradí neplatné sekvence kódových jednotek znakem U+FFFD
(UTF-8 ) nebo &#FFFD; namísto vrácení
prázdného řetězce. |
ENT_DISALLOWED |
Nahradí neplatné sekvence kódových jednotek znakem U+FFFD
(UTF-8 ) nebo &#FFFD; namísto jejich ponechání
tak, jaké jsou. To může být užitečné například k zajištění řádné
formy dokumentů XML s vloženým externím obsahem. |
ENT_HTML401 |
Naloží s kódem jako HTML 4.01. |
ENT_XML1 |
Naloží s kódem jako XML 1. |
ENT_XHTML |
Naloží s kódem jako XHTML. |
ENT_HTML5 |
Naloží s kódem jako HTML 5. |
html_entity_decode()
Je funkce, která převede HTML entity zpět na HTML tagy nebo text. Funkce přijímá celkem čtyři parametry. Prvním parametrem je náš textový řetězec obsahující HTML entity, druhým parametrem jsou vlajky (flags), které udávají, jak zpracovat uvozovky a použitý typ dokumentu. Třetím parametrem je samotné kódování. Ukažme si příklady:
<?php $str = "Kvadratická rovnice je vyjádřena předpisem: 'ax² + bx + c'"; echo htmlentities($str, ENT_COMPAT);
Převede řetězec obsahující HTML entity zpět na původní text bez nich. V konzoli/surovém výpisu poté uvidíme:
Konzolová aplikace
Kvadratická rovnice je vyjádřena předpisem: 'ax² + bx + c'
Další:
<?php $str = "Kvadratická rovnice je vyjádřena předpisem: 'ax² + bx + c'"; echo htmlentities($str, ENT_QUOTES);
Převede řetězec s HTML entity zpět na původní text bez nich společně s apostrofy. V konzoli poté uvidíme:
Konzolová aplikace
Kvadratická rovnice je vyjádřena předpisem: 'ax² + bx + c'
<?php $str = "Kvadratická rovnice je vyjádřena předpisem: 'ax² + bx + c'"; echo htmlentities($str, ENT_NOQUOTES);
Pokud zvolíme za druhý parametr vlajku ENT_NOQUOTES
, dostaneme
v konzoli řetězec bez převedení entity apostrofu:
Konzolová aplikace
Kvadratická rovnice je vyjádřena předpisem: 'ax² + bx + c'
Dostupné vlaječky jsou všechny z funkce htmlentities()
kromě
těchto:
ENT_IGNORE
ENT_SUBSTITUTE
ENT_DISALLOWED
V následujícím kvízu, Kvíz - Převody, hashování řetězců a fonetické funkce v PHP, si vyzkoušíme nabyté zkušenosti z předchozích lekcí.