Parser XHTML

devlop78
Invité n'ayant pas de compte PHPfrance

31 janv. 2011, 00:04

Bonjour à tous.

J'ai un code xHTML créé à partir de CKEditor (un wysiwyg). Dans le meilleur des mondes, et dans la théorie, le code est parfait. Dans la pratique, des balises peuvent ne pas être fermées, etc. J'aurais besoin donc d'un parseur (natif ou non) tolérant.

J'aurais besoin d'obtenir une liste de certaines balises, et d'agir sur les attributs et/ou leurs enfants.

Que mon conseillez-vous (sinon je m'oriente sur expressions régulières ;o) ?

Cordialement,

ViPHP
ViPHP | 5462 Messages

31 janv. 2011, 11:03

DOMDocument suffis :wink: , il peut même réparé ta source.

ViPHP
ViPHP | 928 Messages

01 févr. 2011, 00:23

DOMDocument suffis :wink: , il peut même réparé ta source.
Ah oui ? J'ai toujours cru que le parseur DOM plantait si le document XML n'était pas syntaxiquement correct, tu en es sur ?

ViPHP
ViPHP | 5462 Messages

01 févr. 2011, 00:59

DOMDocument suffis :wink: , il peut même réparé ta source.
Ah oui ? J'ai toujours cru que le parseur DOM plantait si le document XML n'était pas syntaxiquement correct, tu en es sur ?
il fait comme les navigateurs, si le DOM est foireux il va quand même sortir quelque chose,mais si c'est vraiment bien bien naze là il pourra rien faire, par contre les erreurs sont activés par défaut il suffis de déactiver le rapport avec libxml_use_internal_errors :wink:

devlop78
Invité n'ayant pas de compte PHPfrance

01 févr. 2011, 04:42

Je verrai en développant le moteur. Là je code un mini framework (lol ...) avec pas mal de classes, mais je suis assez satisfait (non sans mal) de la répartition des responsabilités. Par contre c'est HS par rapport au sujet, mais quelle alternative puis-je avoir à l'autoload pour qu'il évite de me mettre une page blanche lors d'un Parse Error dans une de mes classes (en dev c'est quand même pas pratique, je suis en plus obligé d'enlever le .htaccess protégeant mes classes et d'appeler classe par classe pour voir l'erreur ... souvent un oubli de parenthèse ^^).

ViPHP
ViPHP | 5462 Messages

01 févr. 2011, 11:25

Je verrai en développant le moteur. Là je code un mini framework (lol ...) avec pas mal de classes, mais je suis assez satisfait (non sans mal) de la répartition des responsabilités. Par contre c'est HS par rapport au sujet, mais quelle alternative puis-je avoir à l'autoload pour qu'il évite de me mettre une page blanche lors d'un Parse Error dans une de mes classes (en dev c'est quand même pas pratique, je suis en plus obligé d'enlever le .htaccess protégeant mes classes et d'appeler classe par classe pour voir l'erreur ... souvent un oubli de parenthèse ^^).
normalement il te dit dans quelle fichier y'a une erreur ? sinon tu pourrais gérer ca avec register_shutdown_function

devlop78
Invité n'ayant pas de compte PHPfrance

03 févr. 2011, 01:58

Zut ... j'ai pas reçu d'email me notifiant ta réponse. Non précisément. J'ai du coup fait un fichier compil.php (nom à la volée) où j'écris "Chargement du fichier x" et je fais l'include. Et là miracle, en local, les erreurs apparaissent, alors qu'elles n'apparaissent pas en hébergement de prod. Pourtant pas de désactivation d'erreurs ...

Je vais regarde le lien donné. Je rappelle aux lecteurs que c'est un problème de PARSE ERROR et non de Notice, Fatal error, ceux là s'affichent bien

devlop78
Invité n'ayant pas de compte PHPfrance

03 févr. 2011, 02:05

Géniale, la fonction fonctionne. Par contre, je vais le relier à la classe de gestion des erreurs, mais il me faudrait déjà savoir s'il y a eu une erreur ... Or là la fonction s'affiche, mais pas l'erreur (et c'est seulement avec l'autoload en local, car l'une de mes classes qui charge les fichiers et classes de pages m'affiche bien mes parse error).

ViPHP
AB
ViPHP | 5818 Messages

03 févr. 2011, 03:37

DOMDocument suffis :wink: , il peut même réparé ta source.
Ah oui ? J'ai toujours cru que le parseur DOM plantait si le document XML n'était pas syntaxiquement correct, tu en es sur ?
C'est loadXML qui plante si la syntaxe n'est pas bonne mais pas loadHTM.

devlop78
Invité n'ayant pas de compte PHPfrance

06 févr. 2011, 05:47

Ca y est ! Deux appli faites avec !

J'ai eu à certains moments des soucis ... notamment avec foreach() lorsque je supprimais (il s'arrêtait, comme en AS3 sur des Array).

Par contre, j'ai toujours un soucis ... Mes balises auto-fermantes sont automatiquement mises non fermées (alors que le code HTML source donné a un code bien comme il faut).

<input .. /> devient donc <input .. >
Modifié en dernier par devlop78 le 07 févr. 2011, 01:12, modifié 1 fois.

ViPHP
ViPHP | 5462 Messages

06 févr. 2011, 20:57

normalement si le DTD est mis y'a pas de soucis

devlop78
Invité n'ayant pas de compte PHPfrance

07 févr. 2011, 01:12

Il y a pourtant un soucis. En plus, j'ai dit une bêtise : les deux applications sont touchées (en fait j'avais regardé la page de l'une à un moment où elle n'est pas manipulée =D> )

ViPHP
ViPHP | 5462 Messages

07 févr. 2011, 01:19

Il y a pourtant un soucis. En plus, j'ai dit une bêtise : les deux applications sont touchées (en fait j'avais regardé la page de l'une à un moment où elle n'est pas manipulée =D> )
montre comment tu fais :wink:

devlop78
Invité n'ayant pas de compte PHPfrance

07 févr. 2011, 01:39

Euhhh ... Je peux pas montrer le code hohoho, l'application que je développe n'existe pas encore ^^

Donc, dans le cas de l'application que je développe actuellement, qui est plus important que l'application de mon client (qui est une application spécifique, et à court terme).

Actuellement, je suis en phase (enfin hier, j'ai superbement avancé) de développement. Donc pas de travail de modélisation objet. J'ai supprimé toutes les méthodes de modification du code HTML (mais mes balises sont qd même modifiées) :
new Document ('<html><head>....</html>');

class Document {

function __construct ($code) {

if (substr(trim($code),0,9) != '<!DOCTYPE') $code = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">" . $code;
$document = $this->document = new DOMDocument();
$document->loadHTML($code);

echo $document->saveHTML();

}

}

devlop78
Invité n'ayant pas de compte PHPfrance

07 févr. 2011, 01:43

Pour être fixé, j'ai essayé avec :
new Document ("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
<html>
<head>
<title>CouCou</title>
</head>
<body>
<form>
<p>
<label for=\"coucou\">Exemple</label> <input type=\"text\" value=\"\" name=\"coucou\" id=\"coucou\" />
</p>
</form>
</body>
</html>
");
et le code qui sort :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head><title>CouCou</title></head>
<body>
<form>
<p>
<label for="coucou">Exemple</label> <input type="text" value="" name="coucou" id="coucou"></p>
</form>
</body>
</html>
En dehors du fait qu'il m'a réindenté le texte... c'est le input qui me gène. Et en plus, il me change mes selected="selected" en simple selected.

Grrrrrr :twisted: