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

Jakub Vrána, Řešení problému, 5.10.2005, diskuse: 8 (nové: 0)

Diskuse

Jirka:

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

ikona Jakub Vrána OpenID:

Takovou možnost jsem nenašel.

Jirka:

A neznate prosim jiny nastroj, ktery by toto umoznoval?

ikona Jakub Vrána OpenID:

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 :-)

ikona Jakub Vrána OpenID:

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.

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

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.