01net    Web


Actuellement en ligne : 516 Utilisateurs dont 22 dans Programmation et développement >S'inscrire      >S'identifier      >Recherche      >Aide  
modéré par A.Ouloube, Beno@  
01net > Forum de 01net > Programmation et développement > PHP
> Script qui ne marche pas correctmeent
Auteur
Message
 
<     1       >
blizzard93
  
   
      ?   @     Posté le 21/07/2007 19:30:21  
Voter pour ce message
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.
<     1       >

01net > Forum de 01net > Programmation et développement > PHP
> Script qui ne marche pas correctmeent

Aller à :

Page générée en : 0.087s - X2board 2.2

Nous contacter | Charte de confiance | Voir notice légale

Tous droits réservés © 1999 - 2008 Groupe Tests - 01net.


Sites du réseau 01net Network : 01net - 01men - Rmc.fr - Bfmtv.fr - Radiobfm.com - TousLesPodcasts - Micro Achat

Widget
Info, Sport et bien plus encore. Tout RMC.fr en un clic sur votre bureau. Téléchargez!
Jeux
Nouveauté : Partez pour les antipodes, à Sydney en Australie, pour vivre la grande aventure.