thekiller242 | 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 :
- <?php
- error_reporting(E_ALL ^ E_NOTICE);
- function parsage($texte){
- $texte = '<zcode>'.$texte.'</zcode>';
- $document_xml = new DomDocument;
- $texte = utf8_encode($texte);
- $document_xml->loadXML($texte);
- $elements = $document_xml->getElementsByTagName('zcode');
- $resultat_html = '';
- $arbre = $elements->item(0);
- $resultat_html = parsage_enfant($arbre);
- return utf8_decode($resultat_html);
- }
- function parsage_normal($noeud, $contenu_a_inserer='')
- {
- $balise_1 = array('gras' => '<strong>',
- 'souligne' => '<div class="souligne">',
- 'barre' => '<div class="barre">',
- 'italique' => '<em>',
- 'position' => '<div class="$1">',
- 'flottant' => '<div class="flot_$1">',
- 'taille' => '<span class="$1">',
- 'couleur' => '<span class="$1">',
- 'police' => '<span class="$1">',
- 'attention' => '<div class="rqm attention">',
- 'information' => '<div class="rqm information">',
- 'erreur' => '<div class="rqm erreur">',
- 'question' => '<div class="rqm question">',
- 'liste' => '<ul>',
- 'puce' => '<li>',
- 'lien' => '<a href="$1">',
- 'image' => '<img src="$1" alt="$2" />',
- 'citation' => ' <span class="citation">Citation</span><div class="citation2">',
- 'titre1' => '<h3>',
- 'titre2' => '<h4>',
- 'email' => '<a href="mailto:$1">',
- 'secret' =>'<span class="spoiler">Secret (cliquez pour afficher)</span><div class="spoiler2" onclick="switch_spoiler(this)"><div style="visibility: hidden;" class="spoiler3">',
- '#text' => ''); // Tableau des balises ouvrantes
-
- $balise_2 = array('gras' => '</strong>',
- 'souligne' => '</div>',
- 'barre' => '</div>',
- 'italique' => '</em>',
- 'position' => '</div>',
- 'flottant' => '</div>',
- 'taille' => '</span>',
- 'couleur' => '</span>',
- 'police' => '</span>',
- 'attention' => '</div>',
- 'information' => '</div>',
- 'erreur' => '</div>',
- 'question' => '</div>',
- 'liste' => '</ul>',
- 'puce' => '</li>',
- 'lien' => '</a>',
- 'image' => '',
- 'citation' => '</div>',
- 'titre1' => '</h3>',
- 'titre2' => '</h4>',
- 'email' => '</a>',
- 'secret' => '</div></div>
- </div>',
- '#text' => ''); // Tableau des balises fermantes
- $attributs = array('position' => 'valeur',
- 'flottant' => 'valeur',
- 'taille' => 'valeur',
- 'couleur' => 'nom',
- 'police' => 'nom',
- 'lien' => 'url',
- 'image' => 'legende',
- 'email' => 'nom'); // Tableau des attributs
-
- $nom = $noeud->nodeName; // On récupère le nom du noeud
-
- if(!empty($contenu_a_inserer)) // On détermine si on veut spécifier du contenu pré-parsé.
- {
- $contenu = $contenu_a_inserer; // Si c'est le cas, on met la variable de fontion en contenu
- }
- else
- {
- $contenu = $noeud->nodeValue; // Sinon, le contenu du noeud.
- }
-
- $premiere_balise = $balise_1[$nom]; // Première balise (ouvrante)
-
- if($noeud->hasAttributes() and $nom != 'image') // On remplace les attributs (sauf pour les images)
- {
-
- $un = $noeud->attributes->getNamedItem($attributs[$nom])->nodeValue; // Récupération de la valeur de l'attribut
- $premiere_balise = str_replace("$1", $un, $premiere_balise); // On remplace la valeur $1 par celle de l'attribut
-
- }
-
- if($nom == 'image') // Cas particulier des images
-
- {
- $un = $contenu; // Dans ce cas, c'est $1 qui récupère le contenu du noeud (l'url de l'image).
- $premiere_balise = str_replace("$1", $un, $premiere_balise);
-
- if($noeud->hasAttributes()) // Si l'image contient une légende (attribut $2)
-
- {
- $deux = $noeud->attributes->getNamedItem('legende')->nodeValue; // Récupération de l'attribut "legende".
- }
- else // Par défaut, la légende (alt) est Image.
- {
- $deux = 'Image';
- }
-
- $premiere_balise = str_replace("$2", $deux, $premiere_balise);
- $intermediaire = $premiere_balise;
-
- }
- else // Cas général
- {
- $intermediaire = $premiere_balise . $contenu . $balise_2[$nom]; // On assemble le tout
- if($nom == 'liste' or $nom == 'puce')
- {
- $intermediaire = preg_replace("#<ul>(\s)*<li>#sU", "<ul><li>", $intermediaire);
- $intermediaire = preg_replace("#</li>(\s)*<li>#sU", "</li><li>", $intermediaire);
- $intermediaire = preg_replace("#</li>(\s)*</ul>#sU", "</li></ul>", $intermediaire);
- }
-
- if($nom == 'zcode')
- {
- $intermediaire = nl2br($intermediaire); // On saute des lignes au résultat final
- }
- }
- return $intermediaire; // On renvoie le texte parsé.
- }
- function parsage_enfant($noeud)// Fonction de parsage d'enfants
- {
- if(!isset($accumulation)) // Si c'est la première balise, on initialise $accumulation
- {
- $accumulation = '';
- }
-
- $enfants_niv1 = $noeud->childNodes; // Les enfants du noeud traité
-
- foreach($enfants_niv1 as $enfant) // Pour chaque enfant, on vérifie...
- {
- if($enfant->hasChildNodes() == true) // ... s'il a lui-même des enfants
- {
- $accumulation .= parsage_enfant($enfant); // Dans ce cas, on revient sur parsage_enfant
- }
- else // ... s'il n'en a plus !
- {
- $accumulation .= parsage_normal($enfant); // On parse comme un noeud normal
- }
- }
- return parsage_normal($noeud, $accumulation);
- }
- ?>
|
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. |