Bien sûr il n'est pas obligatoire d'érire ses pages en XHTML 1.0 Strict. Mais est-il tout de même possible fr produire des pages respectant la norme XHTML 1.0 Strict en utilisant PHP4 et la librairie Tidy ? Les pages de ce site prouvent que c'est possible, mais...


PHP4 n'aime pas l'XHTML 1.0 Strict

Pour s'en convaincre, il suffit de regarder le code HTML produit par la fonction highlight_string(), par exemple.

highlight_string('<? echo "hello world"; ?>');

Comme l'indiquent de nombreuses sources[1], les balises <FONT></FONT> sont obsolètes en XHTML 1.0 Strict.


Tidy n'aime pas l'XHTML 1.0 Strict

La librairie Tidy permet, en principe, de nettoyer le code HTML, signaler ou corriger des erreurs, soigner la présentation, valider la syntaxe HTML... Chaque Billet, chaque commentaire de ce weblog est ainsi nettoyé avant d'être ajouté dans la base de donnée et chaque page de ce site subit un dernier toilettage avant de vous être servie. Cependant, Tidy n'est pas une panacée. Cet outil ne corrige pas toutes les erreurs. Associer Tidy et PHP4 peut même réserver des surprises.

Prenons par exemple le code suivant :

Tidy et PHP4
<?php
  $content= <<<EOT
<html><meta http-equiv="Content-Type" content="text/html;
charset=utf-8"></html><body>
<form action="/" id="formTest">
<p><input type="submit" value="submit" ></p>
</form>
EOT;   
  tidy_set_encoding('UTF8');
  tidy_parse_string($content);
  tidy_setopt('output-xhtml', true);
  tidy_setopt('indent', true);
  tidy_setopt('indent-spaces', 2);
  tidy_setopt('wrap', 100);
  tidy_clean_repair();
  echo tidy_get_output();
?>

Ce code PHP produit une page dont le code HTML est le suivant :

code HTML produit
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
  </head>
  <body>
    <form action="/" id="formTest" name="formTest">
      <p>
        <input type="submit" value="submit" />

      </p>
    </form>
  </body>
</html>

Le doctype fait bien référence à XHTML 1.0 Strict. Jusque là, aucun problème. Mais le code HTML qui suit n'est nullement conforme au doctype annoncé ! Pire,certaines balises mal écrites ont bien été corrigées mais, surtout, Tidy a ajouté une erreur (!) : un attribut "name" invalide. Horreur ! Peut-on imaginer une poudre à lessive qui ajouter des taches au lieu de les enlever ? Devant ce constat, pour viser un respect de la norme XHTML 1.0 Strict, il vaut mieux échanger son baril de lessive PHP4/Tidy contre deux barils PHP5/Tidy, ou, en plus de l'usage de la librairie Tidy, nettoyer son code à la main. A grands coups d'expressions régulières en espérant que l'hébergeur adopte très rapidement PHP5...

Voilà en tout cas une raison supplémentaire (à defaut d'être réellement pertinente) pour passer à PHP5.