DOM : gérer les erreurs de syntaxe

DOM : gérer les erreurs de syntaxe - PHP - Programmation

Marsh Posté le 16-07-2007 à 11:42:05    

Hello :) ,
 
Je suis entrain de créer un un parseur xml dont le but sera de parser des balises comme <gras>texte</gras> en texte.
 
Voici mon code :  

Code :
  1. <?php
  2. error_reporting(E_ALL ^ E_NOTICE);
  3. function parsage($texte){
  4.   $texte = '<zcode>'.$texte.'</zcode>';
  5.   $document_xml = new DomDocument;
  6.   $texte = utf8_encode($texte);
  7.   $document_xml->loadXML($texte);
  8.   $elements = $document_xml->getElementsByTagName('zcode');
  9.   $resultat_html = '';
  10.   $arbre = $elements->item(0);
  11.   $resultat_html = parsage_enfant($arbre);
  12.   return utf8_decode($resultat_html);
  13. }
  14. function parsage_normal($noeud, $contenu_a_inserer='')
  15. {
  16.      $balise_1 = array('gras' => '<strong>',
  17.                                                                 'souligne' => '<div class="souligne">',
  18.                                                                 'barre' => '<div class="barre">',
  19.                                 'italique' => '<em>',
  20.                                 'position' => '<div class="$1">',
  21.                                 'flottant' => '<div class="flot_$1">',
  22.                                 'taille' => '<span class="$1">',
  23.                                 'couleur' => '<span class="$1">',
  24.                                 'police' => '<span class="$1">',
  25.                                 'attention' => '<div class="rqm attention">',
  26.                                                                 'information' => '<div class="rqm information">',
  27.                                                                 'erreur' => '<div class="rqm erreur">',
  28.                                                                 'question' => '<div class="rqm question">',
  29.                                 'liste' => '<ul>',
  30.                                 'puce' => '<li>',
  31.                                 'lien' => '<a href="$1">',
  32.                                 'image' => '<img src="$1" alt="$2" />',
  33.                                 'citation' => ' <span class="citation">Citation</span><div class="citation2">',
  34.                                                                 'titre1' => '<h3>',
  35.                                                                 'titre2' => '<h4>',
  36.                                                                 'email' => '<a href="mailto:$1">',
  37.                                                                 'secret' =>'<span class="spoiler">Secret (cliquez pour afficher)</span><div class="spoiler2" onclick="switch_spoiler(this)"><div style="visibility: hidden;" class="spoiler3">',
  38.                                 '#text' => ''); // Tableau des balises ouvrantes
  39.                                              
  40. $balise_2 = array('gras' => '</strong>',
  41.                                                                 'souligne' => '</div>',
  42.                                                                 'barre' => '</div>',
  43.                                 'italique' => '</em>',
  44.                                 'position' => '</div>',
  45.                                 'flottant' => '</div>',
  46.                                 'taille' => '</span>',
  47.                                 'couleur' => '</span>',
  48.                                 'police' => '</span>',
  49.                                 'attention' => '</div>',
  50.                                 'information' => '</div>',
  51.                                                                 'erreur' => '</div>',
  52.                                                                 'question' => '</div>',
  53.                                 'liste' => '</ul>',
  54.                                 'puce' => '</li>',
  55.                                 'lien' => '</a>',
  56.                                 'image' => '',
  57.                                 'citation' => '</div>',
  58.                                                                 'titre1' => '</h3>',
  59.                                                                 'titre2' => '</h4>',
  60.                                                                 'email' => '</a>',
  61.                                                                 'secret' => '</div></div>     
  62. </div>',
  63.                                 '#text' => ''); // Tableau des balises fermantes
  64. $attributs = array('position' => 'valeur',
  65.                                 'flottant' => 'valeur',
  66.                                 'taille' => 'valeur',
  67.                                 'couleur' => 'nom',
  68.                                 'police' => 'nom',
  69.                                 'lien' => 'url',
  70.                                 'image' => 'legende',
  71.                                                                 'email' => 'nom'); // Tableau des attributs
  72.                                                              
  73.         $nom = $noeud->nodeName; // On récupère le nom du noeud
  74.      
  75.         if(!empty($contenu_a_inserer)) // On détermine si on veut spécifier du contenu pré-parsé.
  76.         {
  77.                 $contenu = $contenu_a_inserer; // Si c'est le cas, on met la variable de fontion en contenu
  78.         }
  79.         else
  80.         {
  81.                 $contenu = $noeud->nodeValue; // Sinon, le contenu du noeud.
  82.         }
  83.      
  84.         $premiere_balise = $balise_1[$nom];     // Première balise (ouvrante)
  85.      
  86.         if($noeud->hasAttributes() and $nom != 'image') // On remplace les attributs (sauf pour les images)
  87.         {           
  88.                      
  89.                 $un = $noeud->attributes->getNamedItem($attributs[$nom])->nodeValue; // Récupération de la valeur de l'attribut
  90.                 $premiere_balise = str_replace("$1", $un, $premiere_balise); // On remplace la valeur $1 par celle de l'attribut
  91.              
  92.         }
  93.      
  94.         if($nom == 'image') // Cas particulier des images
  95.              
  96.         {
  97.                 $un = $contenu; // Dans ce cas, c'est $1 qui récupère le contenu du noeud (l'url de l'image).
  98.                 $premiere_balise = str_replace("$1", $un, $premiere_balise);
  99.              
  100.                 if($noeud->hasAttributes()) // Si l'image contient une légende (attribut $2)
  101.              
  102.                 {
  103.                         $deux = $noeud->attributes->getNamedItem('legende')->nodeValue; // Récupération de l'attribut "legende".
  104.                 }
  105.                 else // Par défaut, la légende (alt) est Image.
  106.                 {
  107.                         $deux = 'Image';
  108.                 }
  109.      
  110.                 $premiere_balise = str_replace("$2", $deux, $premiere_balise);
  111.                 $intermediaire = $premiere_balise;
  112.      
  113.         }
  114.         else // Cas général
  115.         {
  116.                $intermediaire = $premiere_balise . $contenu . $balise_2[$nom]; // On assemble le tout
  117.                 if($nom == 'liste'  or $nom == 'puce')
  118.                 {
  119.                         $intermediaire = preg_replace("#<ul>(\s)*<li>#sU", "<ul><li>", $intermediaire);
  120.                         $intermediaire = preg_replace("#</li>(\s)*<li>#sU", "</li><li>", $intermediaire);
  121.                         $intermediaire = preg_replace("#</li>(\s)*</ul>#sU", "</li></ul>", $intermediaire);
  122.                 }
  123.              
  124.                 if($nom == 'zcode')
  125.                 {
  126.                         $intermediaire = nl2br($intermediaire); // On saute des lignes au résultat final
  127.                 }
  128.         }
  129.         return $intermediaire; // On renvoie le texte parsé.
  130. }
  131. function parsage_enfant($noeud)// Fonction de parsage d'enfants
  132. {
  133.         if(!isset($accumulation)) // Si c'est la première balise, on initialise $accumulation
  134.         {
  135.                 $accumulation = '';
  136.         }
  137.      
  138.         $enfants_niv1 = $noeud->childNodes; // Les enfants du noeud traité
  139.      
  140.         foreach($enfants_niv1 as $enfant) // Pour chaque enfant, on vérifie...
  141.         {
  142.                 if($enfant->hasChildNodes() == true) // ... s'il a lui-même des enfants
  143.                 {
  144.                         $accumulation .= parsage_enfant($enfant); // Dans ce cas, on revient sur parsage_enfant
  145.                 }
  146.                 else // ... s'il n'en a plus !
  147.                 {
  148.                         $accumulation .= parsage_normal($enfant); // On parse comme un noeud normal
  149.                 }
  150.         }
  151.         return parsage_normal($noeud, $accumulation);
  152. }
  153. ?>


 
Voila, tout est fonctionnel, le seul problème, c'est que site un visiteur tape ce code là par exemple :
<souligne>test</soulignes>
Il y a une erreure de syntaxe, et php m'envoie un beau petit message d'erreur :
 
Warning: DOMDocument::loadXML() [function.DOMDocument-loadXML]: expected '>' in Entity, line: 1 in C:\Documents and Settings\Administrateur\Bureau\Quentin\Sites\zcode\zcode.php on line 8
 
Warning: Invalid argument supplied for foreach() in C:\Documents and Settings\Administrateur\Bureau\Quentin\Sites\zcode\zcode.php on line 143
 
Fatal error: Call to a member function hasAttributes() on a non-object in C:\Documents and Settings\Administrateur\Bureau\Quentin\Sites\zcode\zcode.php on line 89

 
 
J'aimerais savoir comment gérer facilement et simplement les erreurs de syntaxe.
 
Merci d'avance.

Reply

Marsh Posté le 16-07-2007 à 11:42:05   

Reply

Marsh Posté le 16-07-2007 à 11:59:47    

http://fr.php.net/manual/fr/functi [...] errors.php


---------------
When it's from Finland it's good.  - Mon blog
Reply

Marsh Posté le 16-07-2007 à 12:16:40    


 
Exact :) .
Tuto sur DOM, j'essaye de mis mettre.
Le zcode est quand même bien plus puissant que le bbcode.
 
Je regarde le liens de la doc.
 

Reply

Marsh Posté le 16-07-2007 à 12:24:56    

J'ai également un autre problème.
Si je fait ça :  
<image legende="legende de l'image">url de l'image</image>
En local, ça marche niquel, mais en ligne, (1and1.fr), ça m'affiche un message d'erreur :  
 
Warning: DOMDocument::loadXML() [function.DOMDocument-loadXML]: AttValue: " or ' expected in Entity, line: 1 in /homepages/46/d210330404/htdocs/zcode/zcode.php on line 10
 
Warning: DOMDocument::loadXML() [function.DOMDocument-loadXML]: attributes construct error in Entity, line: 1 in /homepages/46/d210330404/htdocs/zcode/zcode.php on line 10
 
Warning: DOMDocument::loadXML() [function.DOMDocument-loadXML]: Couldn't find end of Start Tag image line 1 in Entity, line: 1 in /homepages/46/d210330404/htdocs/zcode/zcode.php on line 10
 
Warning: DOMDocument::loadXML() [function.DOMDocument-loadXML]: Opening and ending tag mismatch: zcode line 1 and image in Entity, line: 1 in /homepages/46/d210330404/htdocs/zcode/zcode.php on line 10
 
Warning: DOMDocument::loadXML() [function.DOMDocument-loadXML]: Extra content at the end of the document in Entity, line: 1 in /homepages/46/d210330404/htdocs/zcode/zcode.php on line 10
 
Warning: Invalid argument supplied for foreach() in /homepages/46/d210330404/htdocs/zcode/zcode.php on line 149
 
Fatal error: Call to a member function hasAttributes() on a non-object in /homepages/46/d210330404/htdocs/zcode/zcode.php on line 95
 
http://www.robotix.fr/zcode/

Reply

Marsh Posté le 16-07-2007 à 12:45:27    

http://fr.php.net/manual/fr/functi [...] errors.php
 
Tu pourras retrouver les erreurs grâce à ça normalment :)
 
Savage

Reply

Marsh Posté le 13-09-2007 à 18:13:55    

Heu, nan, j'arrive pas :p .
Faudrait que tu me donnes ta méthode bien moche NazzTazz.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed