Převod HTML na XHTML
Školení, která pořádám
Pokud máme stránky v jazyce XHTML a data pro ně dostáváme v jazyce HTML, je potřeba je nějak převést. Taková situace může nastat např. při použití formátovacího editoru v Internet Exploreru. Značky a atributy produkované tímto editorem mají nejednotnou velikost písmen, nepárové značky nejsou ukončené a hodnoty atributů nebývají uzavřené do uvozovek. Jistě by se v PHP dala napsat jednoduchá funkce, která by tyto základní nedostatky odstranila, pokud bychom ji ale chtěli napsat univerzálně, dalo by to asi dost práce. Vyplatí se proto využít existující nástroje, přímo v PHP je k dispozici rozšíření Tidy, najít by se jistě dala i externí knihovna.
<?php
echo tidy_repair_string($_POST["html"], array('output-xhtml' => true, 'show-body-only' => true), 'raw');
?>
Funkce tidy_repair_string vrátí díky nastavení show-body-only
pouze obsah značky <body>
.
Diskuse
Jirka:
Je mozne pomoci rozsireni Tidy opravovat i obsah atributu tak, aby byly validni? Aby napr. ve vystupu nebylo align="bottom"
Jirka:
A neznate prosim jiny nastroj, ktery by toto umoznoval?
Jakub Vrána :
Bohužel ne. Ale vytvořit si vlastní skript, který by na základě informací v DTD zanechal jen platné hodnoty, by neměl být až takový problém.
Jirka:
Jake rozsireni byste na pouzil? XML parser, DOM? Bohuzel se v tomto prilis nevyznam, ale kdyz me navedete spravnym smerem, rad se to naucim :-)
Jakub Vrána :
Já bych si s tím asi hlavu příliš nelámal a seznam povolených hodnot bych si z toho vytáhnul ručně do struktury typu
<?php
array("img" => array("align" => "bottom|middle|top|left|right"));
?>
Jirka:
Pri upravach jsem narazil na jednu "zajimavost":
Pokud stejny vstup se stejnym $config zpracuji pomoci
<?php
tidy_repair_string($input, $config, 'utf8');
?>
nebo
<?php
$tidy = new tidy();
$tidy->parseString($input, $config, 'utf8');
$tidy->cleanRepair();
?>
tak se vystup mirne lisi. Zatim jsem si vsiml pouze toho, ze u objektoveho pristupu se zrejme ignoruje nastaveni clean = true, protoze neprevadi napr. znacku font na jeji CSS variantu, zatimco tidy_repair_string ano.
shuster:
Popisany priklad s danymi nastaveniami nedokaze prekonvertovat HTML do validneho XHTML.
Robil som trochu pokusy s roznymi nastaveniami parametrov tidy.
Pouzivam tento kod (pre XHTML strict):
<?php
$_CFG['tidyuse'] = true; // konfiguracna premenna
if (function_exists('tidy_repair_string') && ($_CFG['tidyuse']==true))
{ // nastavenia pre strict XHTML
$xhtml = tidy_repair_string($xhtml, array('output-xhtml' => true, 'show-body-only' => true, 'doctype' => 'strict', 'drop-font-tags' => true, 'drop-proprietary-attributes' => true, 'lower-literals' => true, 'quote-ampersand' => true, 'wrap' => 0), 'raw');
}
?>
Podobne nastavenia odporucaju aj tu:
http://www.tbs-sct.gc.ca/clf2-nsi2/tb-bo/td-dt/mxhtmls-eng.asp
Diskuse je zrušena z důvodu spamu.