Převod HTML na XHTML

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>.

Jakub Vrána, Řešení problému, 5.10.2005, on-line

Diskuse

Jirka:

Je mozne pomoci rozsireni Tidy opravovat i obsah atributu tak, aby byly validni? Aby napr. ve vystupu nebylo align="bottom"
31.1.2007 14:38:52

ikona Jakub Vrána:

Takovou možnost jsem nenašel.
31.1.2007 14:50:42

Jirka:

A neznate prosim jiny nastroj, ktery by toto umoznoval?
31.1.2007 23:10:44

ikona 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.
31.1.2007 23:58:06

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 :-)
1.2.2007 14:44:04

ikona 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"));
?>

1.2.2007 14:58:53

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.
1.2.2007 16:39:39

ikona 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
29.10.2007 21:19:14
avatar © 2005-2024 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.