Je sens que je vais faire des heureux, notamment Laurent Denis ou Éric Daspet :)
Ce blog est en effet toujours en XHTML 1.1 pour les navigateurs supportant le Xhtml. Il est donc correctement envoyé en application/xhtml+xml
à ces navigateurs.
Mais la nouveautés aujourd'hui est que les navigateurs ne supportant pas ce type MIME recevront du... HTML 4.01, tout bien formé, tout comme il faut :)
D'après une forte inspiration d'une page de Keystone Websites, j'ai codé quelques fonctions bien pratiques me permettant de détecter les capacités du navigateur, et de modifier mon contenu en conséquence.
function ShouldSendXhtml() { // Si le navigateur gère le type MIME XHTML if( stristr($_SERVER['HTTP_ACCEPT'], 'application/xhtml+xml') ) { // Si le navigateur a spécifié une priorité pour le XHTML if( preg_match('/application\/xhtml\+xml;q=0(\.[1-9]+)/i', $_SERVER['HTTP_ACCEPT'], $aResults) ) { $nXhtmlQ = (int)($aResults[1]); // Si le navigateur a spécifié une priorité pour le HTML if( preg_match('/text\/html;q=0(\.[1-9]+)/i', $_SERVER['HTTP_ACCEPT'], $aResults) ) { $nHtmlQ = (int)($aResults[1]); // Si le navigateur demande en priorité du HTML, on lui servira if($nHtmlQ > $nXhtmlQ) { return false; } } } return true; } return false; } function TransformToHtml($strBuffer) { return preg_replace('!\s*/>!', '>', $strBuffer); } function WriteXhtmlHeader() { $strCharset = 'utf-8'; if( ShouldSendXhtml() ) { header('Content-type: application/xhtml+xml; charset=' . $strCharset); echo '<?xml version="1.0" encoding="'.$strCharset.'"?>' . "\n"; ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr"> <? } else { header('Content-type: text/html; charset=' . $strCharset); // Démarre la bufferisation de contenu, et appelle la fonction TransformToHtml // lorsque celui-ci est terminé et prêt à être envoyé au navigateur ob_start("TransformToHtml"); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang="fr"> <? } }
PS: Alors Denis ?
1 De ___seb -
On dirait que ces fonctions ne sont pas utilisées sur ce blog puisque je reçois du xhtml 1.0, hors je devrais recevoir du xhtml 1.1 ou du html 4... Un problème ?
2 De Vincent -
Aucun. Ce billet est juste un peu vieux et d'autres réflexions m'ont amené à ne plus utiliser xHTML 1.1.
Ce blog est aujourd'hui uniquement en xHTML 1.0.