Odstranění nadbytečných entit

Školení, která pořádám

V HTML a XHTML dokumentech lze z historických důvodů používat pro zápis některých znaků entity. Ve znakové sadě Unicode (tedy např. v kódování UTF-8) ale už tyto entity nejsou potřeba a vystačíme si se základními XML entitami vytvářenými funkcí htmlspecialchars. Používání funkce htmlentities je tedy s kódováním UTF-8 zbytečné.

Někdy se znakových entit dokonce musíme zbavit. Konkrétně formát Atom dovoluje vkládat XHTML kód (to ostatně můžou umožňovat i jiné XML dokumenty), ten ale nesmí obsahovat znakové entity, protože ty jsou definované v externím DTD, který není připojen. Když tedy chceme validní XHTML fragment vložit do formátu Atom, musíme se entit zbavit.

PHP obsahuje funkci html_entity_decode, ta ale změní všechny entity – základní entity potřebujeme zachovat. Funkce get_html_translation_table zase pracuje jen s jednobajtovým kódováním. K odstranění nadbytečných entit tedy potřebujeme nejprve podruhé ošetřit ty základní a pak odošetřit všechny:

<?php
/** Odstranění znakových XHTML entit
* @param string XHTML v kódování UTF-8
* @return string XHTML obsahující pouze základní XML entity
* @copyright Jakub Vrána, https://php.vrana.cz/
*/
function remove_xhtml_entities($xhtml) {
    return html_entity_decode(preg_replace('~&(lt|gt|amp);~', '&amp;\\1;', $xhtml), ENT_NOQUOTES, "utf-8");
}
?>
Jakub Vrána, Řešení problému, 7.7.2010, diskuse: 0 (nové: 0)

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.