Ainsi dans PHP, ?> n'indique pas forcément la fin d'un bloc PHP. On peut très bien avoir :

 <p><?php echo "?>"; ?></p>

L'exécution de ce bout de code produisant <p>?></p>. Or un parser xml lui, lors de l'analyse du fichier HTML verra les éléments suivants:

  • <p> (noeud élément)
    • <?php echo "?> (noeud processing instruction)
    • "; ?> (noeud texte)

On a le même problème avec les commentaires :

<p><?php echo "bla"; /* ?> */ ?></p>

Le parser xml verra :

  • <p> (noeud élément)
    • <?php echo "bla"; /* ?> (noeud processing instruction)
    • */ ?> (noeud texte)

Pour un parser SGML (c'est le cas de Nvu dans lequel on ne peut éditer pour le moment que du HTML), s'ajoute le problème suivant :

 <p><?php if($a > 12) echo 'foo'; ?></p>

En effet, pour lui, la fin d'une "processing instruction" est > et non pas ?> comme en xml. On obtient donc le DOM :

  • <p> (noeud élément)
    • <?php if($a > (noeud processing instruction)
    • 12) echo 'foo'; ?> (noeud texte)

Bref, ces exemples montrent que l'on se retrouve avec des noeuds texte qui ne devraient pas exister. Ils apparaîtront donc en tant que texte lors de la visualisation du document.

Une solution serait alors de hacker le parser xml pour prendre en compte l'analyse de l'intérieur des balises php

  1. détecter le début d'un bloc php
  2. parser de la même manière que le parser du moteur PHP (c'est à dire, détection des chaînes PHP, des commentaires, des opérateurs etc...)
  3. détecter la fin d'un bloc php, en prenant en compte uniquement les ?> qui sont en dehors d'éléments PHP (chaînes et commentaires principalement)

C'est du boulot, ça rend le parser un plus lent, mais c'est faisable.

Malheureusement il existe un autre problème, que l'on ne peut résoudre. Voici un bout de code :

<p>
  <?php  echo "</p>"; ?>

Un parser XML ralera car il ne trouve pas la balise de fermeture de <p> : le document n'est pas éditable. Il verra seulement une "processing instruction". Un parser SGML (donc HTML) ne ralera pas mais n'interpretera pas ça de la façon que l'on veut :

  • <p> (noeud element)
    • <?php echo "</p> (noeud processing instruction)
    • "; ?> (noeud texte)

Même problème (sinon pire) avec :

<?php  echo "<p>"; ?>
 foo</p>

Bref, ces cas sont un véritable problème qu'il est impossible de résoudre dans un éditeur orienté balisage SGML/XML comme Nvu. C'est au développeur d'avoir un code PHP propre, où toutes les balises ouvertes/fermées en dehors des blocs PHP doivent être fermées/ouvertes en dehors des blocs PHP.

Reste le cas où les blocs PHP génèrent eux-mêmes à la fois les balises ouvrantes et fermantes :

<?php echo '<p>bla bla</p>';?>

Dans un éditeur wysiwyg, qui n'exécute pas par nature le code PHP, on ne verra jamais le paragraphe "bla bla". Finalement, éditer un fichier PHP dans un éditeur wysiwyg n'a pas toujours de sens, puisqu'on ne voit pas vraiment ce qu'on aura. Éditer un fichier PHP dans ce genre d'éditeur revient à faire du wysimwyg : What You See Is Maybe What You Get. Aucun intérêt.

Le mieux, dans une application PHP, serait d'utiliser un moteur de template dont le balisage n'a pas d'incidence sur l'interprétation du document brut. Et encore...