Pour valider une page html

il faut activer tout les messages d'erreur : error_reporting(E_ALL);

vous pouvez valider en chargeant un fichier externe :

$dom = new DOMDocument;
$dom->Load('mapage.html');
$dom->validate();

Mais dans un développement en php, il est plus probable qu'il y ai déjà dans le script une chaîne de caractères avec toute la page

$dom = DOMDocument::loadXML($machainexml);
$dom->validate();

Pour le html 4, il existe aussi l'équivalent de ces fonctions : DOMDocument->loadHTMLFile() et DOMDocument->loadHTML()

Les messages d'erreur remontés par php ne ressemblent pas à ceux du validateur du W3C. Par exemple, si je met une balise div dans une balise p :

Warning: Element div is not declared in p list of possible children

alors que le W3C m'affiche pour la même erreur :

The mentioned element is not allowed to appear in the context in which you've placed it; the other mentioned elements are the only ones that are both allowed there and can contain the element mentioned. This might mean that you need a containing element, or possibly that you've forgotten to close a previous element.

One possible cause for this message is that you have attempted to put a block-level element (such as "<p>" or "<table>") inside an inline element (such as "<a>", "<span>", or "<font>").

Pour ma part, je ne suis pas contre des messages plus court à lire, par contre, la ligne indiquée par php est celle de la fonction validate() dans le code php, il n'y a aucun renseignements sur la position de l'erreur.

améliorer les performances

Php valide en utilisant le fichier DTD fourni dans le document, pour éviter que le valideur télécharge les fichiers DTD sur Internet à chaque appel de la page, il faut créer une copie sur son serveur de développement local. Par exemple pour du xhtml 1 strict il faut les fichiers :

  1. http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd
  2. http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent
  3. http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent
  4. http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent

ensuite, changer le doctype du document a valider (ne pas oublier de remettre le bon avant de passer en production!) :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://localhost/dtd/xhtml1-strict.dtd">

Pour aller plus loin

pour nettoyer et manipuler les documents HTML : Tidy, extension de PHP et en module d'apache