|
|
Bonjour a tous.
Je creer un system pour corriger les erreurs de sytaxes des documents XML pour pouvoir faire fonctionner correctement la librairie DOM.
Pour ca j'ai creer un petit texte de test tout bête :
<gras>salut</gras>
<couleur nom="bleu">salut</couleur>
sa va ?
<liste>
<puce>oui oui, et toi</puce>
<puce>tres bien</puce>
</liste>
<italique>tu fais quoi de beaux ?</italique>
<tableau>
<ligne>
<entete>au rien</entete>
<cellule>et toi</cellule>
</ligne>
</tableau>
<exposant>rien, comme toi.</exposant> aller <acronyme valeur="salut">slt</acronyme>
slt
mais une foi passer au debugueur ca devient ca..
<gras>salut</gras>
<couleur nom="bleu">salut</couleur>
sa va ?
<liste>
<puce>oui oui, et toi
<puce>oui oui, et toi</puce>
<puce>tres bien</puce>
</liste>
<italique>tu fais quoi de beaux ? <gras>salut</gras>
<couleur nom="bleu">salut</couleur>
sa va ?
<liste>
<puce>oui oui, et toi</puce>
<puce>tres bien</puce>
</liste>
<italique>tu fais quoi de beaux ?</italique>
<tableau>
<ligne>
<entete>au rien</entete>
<cellule>et toi</cellule>
</ligne>
</tableau>
<exposant>rien, comme toi.</exposant> aller <acronyme valeur="salut">slt</acronyme>
Je ne vois absolument pas d'ou peut provenir cette erreur mais j'espere que vous pourrez m'aider a la resoudre, voila mon script PHP :
// fonction de debuguage, retourne le resultat traiter par debuguerXML_parsage()
function debugueurXML($chaine)
{
return debugueurXML_parsage($chaine);
}
// fonction qui traite la chaine a debuguer
function debugueurXML_parsage($chaine)
{
$accumulation = ''; // acumulation des données traitées
$longueurChaine = strlen($chaine); // la longueur de la chaine a traiter
if (!$longueurChaine)
return '';
// on fait une boucle pour chaque caracteres
$caractereActuel = 0;
while ($caractereActuel < $longueurChaine)
{
if ($caractereActuel) // creation du debut des regexs (pour ignorer tout les caractere avant celui actuel
$regex_CP = '^.{'.$caractereActuel.'}';
else
$regex_CP = '^';
// si le caractere est un < on verifie que c'est bien une balise
if ($chaine[$caractereActuel] == '<')
{
if (preg_match('`'.$regex_CP.'<[a-zA-Z]+( +[a-zA-Z0-9_-]+=("[^"]*"|\'[^\']*\'))* *>`s', $chaine))
{
// creation des variables contenant la balise ouvrante et le nom de la balise
$balise = preg_replace('`'.$regex_CP.'(<[a-zA-Z]+( +[a-zA-Z0-9_-]+=("[^"]*"|\'[^\']*\'))* *>).*$`s', '$1', $chaine);
$nom = preg_replace('`^<([a-zA-Z]+).*$`', '$1', $balise);
// si il y a une balise fermante
if (preg_match('`'.$regex_CP.$balise.'.*</'.$nom.' *>`is', $chaine))
{
// balises contenant le texte entre les deux balises et la balise fermante
$contenuBalise = preg_replace('`'.$regex_CP.$balise.'(.*)</'.$nom.' *>.*$`isU', '$1', $chaine);
$baliseFermante = preg_replace('`'.$regex_CP.$balise.$contenuBalise.'(</'.$nom.' *>).*$`is', '$1', $chaine);
// petite boucle pour remplacer les & < et > dans la balise ouvrante par leur caracteres speciaux, le nouveau contenu sera enregistrer dans $baliseModifier
$baliseModifier = '';
$i = 0;
$longueurBalise = strlen($balise);
while ($i < $longueurBalise)
{
if ($balise[$i] == '<' AND $i)
$baliseModifier .= '<';
elseif ($balise[$i] == '>' AND $i < ($longueurBalise-1))
$baliseModifier .= '>';
elseif ($balise[$i] == '&')
{
if ($i)
$regex_balise_CP = '^.{'.$i.'}';
else
$regex_balise_CP = '^';
if (preg_match('`'.$regex_balise_CP.'&(amp|lt|gt|quot|apos);`s', $balise))
{
$caractereSpecial = preg_replace('`'.$regex_balise_CP.'(&(amp|lt|gt|quot|apos);).*$`s', '$1', $balise);
$baliseModifier .= $caractereSpecial;
$i += (strlen($caractereSpecial)-1);
}
else
$baliseModifier .= '&';
}
else
$baliseModifier .= $balise[$i];
$i++;
}
// on ajoute le tout a l'accumulation et on replace notre cursuer sur le bon caractere en modifiant $caractereActuel
$accumulation .= $baliseModifier.debugueurXML_parsage($contenuBalise).$baliseFermante;
$caractereActuel += strlen($balise.$contenuBalise.$baliseFermante);
}
else // si la balise était pas fermer quelque par on considere que ce n'en était pas une
{
$accumulation .= '<';
$caractereActuel++;
}
} // si c'est une balise recoursie (avec le <image/> au lieu de <image></image>)
elseif (preg_match('`'.$regex_CP.'<[a-zA-Z]+( +[a-zA-Z0-9_-]+=("[^"]*"|\'[^\']*\'))* */>`s', $chaine))
{
//pareil qu'avant mais avec la balise fermante et le contenu en moin a traiter
$balise = preg_replace('`'.$regex_CP.'(<[a-zA-Z]+( +[a-zA-Z0-9_-]+=("[^"]*"|\'[^\']*\'))* */>).*$`s', '$1', $chaine);
$baliseModifier = '';
$i = 0;
$longueurBalise = strlen($balise);
while ($i < $longueurBalise)
{
if ($balise[$i] == '<' AND $i)
$baliseModifier .= '<';
elseif ($balise[$i] == '>' AND $i < ($longueurBalise-1))
$baliseModifier .= '>';
elseif ($balise[$i] == '&')
{
if ($i)
$regex_balise_CP = '^.{'.$i.'}';
else
$regex_balise_CP = '^';
if (preg_match('`'.$regex_balise_CP.'&(amp|lt|gt|quot|apos);`s', $balise))
{
$caractereSpecial = preg_replace('`'.$regex_balise_CP.'(&(amp|lt|gt|quot|apos);).*$`s', '$1', $balise);
$baliseModifier .= $caractereSpecial;
$i += (strlen($caractereSpecial)-1);
}
else
$baliseModifier .= '&';
}
else
$baliseModifier .= $balise[$i];
$i++;
}
$accumulation .= $baliseModifier;
$caractereActuel += $longueurBalise;
}
else
{
$accumulation .= '<';
$caractereActuel++;
}
} // sinon si le caractere est un > on met > a la place dans $accumulation et on incremente $caractereActuel
elseif ($chaine[$caractereActuel] == '>')
{
$accumulation .= '$gt;';
$caractereActuel++;
} // sinon si le caractere est un &
elseif ($chaine[$caractereActuel] == '&')
{
// si le & est le debut d'un caractere special on le laisse tel quel et on le saute
if (preg_match('`'.regex_CP.'&(amp|lt|gt|quot|apos);`s', $chaine))
{
$caractereSpecial = preg_replace('`'.regex_CP.'(&(amp|lt|gt|quot|apos);).*$`s', '$1', $chaine);
$accumulation .= $caractereSpecial;
$caractereActuel += strlen($caractereSpecial);
}
else // sinon on ajoute & a la place dans l'accumulation
{
$accumulation .= '&';
$caractereActuel++;
}
}
else // sinon on ajoute le caractere et on increment $caractereActuel
{
$accumulation .= $chaine[$caractereActuel];
$caractereActuel++;
}
}
return $accumulation;
}
Merci d'avance de votre aide.
|