PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 02-11-2009 14:14:21

cramj
Membre
Inscription : 02-11-2009
Messages : 15

[Résolu] Supprimer block dans fichier XML

Bonjour,

j'ai un fichier XML (extrait):

...
    <row>
      <string>MQCD.0</string>
      <number tooltip='3.75 joueur(s) sur MQCD.0 (00h)'>3.75</number>
      <number tooltip='0 joueur(s) sur MQCD.0 (01h)'>0</number>
    </row>
    <row>
      <string>MQCD.1</string>
      <number tooltip='3.25 joueur(s) sur MQCD.1 (00h)'>3.25</number>
      <number tooltip='2.58 joueur(s) sur MQCD.1 (01h)'>2.58</number>
    </row>
    <row>
      <string>MQCD.2</string>
      <number tooltip='0 joueur(s) sur MQCD.2 (00h)'>0</number>
      <number tooltip='1.42 joueur(s) sur MQCD.2 (01h)'>1.42</number>
    </row>
    <row>
      <string>MQCD.3</string>
      <number tooltip='0.08 joueur(s) sur MQCD.3 (00h)'>0.08</number>
      <number tooltip='0.42 joueur(s) sur MQCD.3 (01h)'>0.42</number>
    </row>
    <row>
...

et un fichier .php qui devrait pouvoir supprimer le bloc <row><string>MQCD.1... </row>
avec une variante : supprimer  les blocs <row><string>MQCD.0... </row> et <row><string>MQCD.2... </row>
ou autres...

la regex utilisée : (un test pour commencer, devrait supprimer tous les blocs <row>)

$get_fichier = preg_replace('`\<row\>([^\</row\>]*)\</row\>`s' , '', $get_fichier);

Mais rien ne se passe, même pas une erreur (avec error_reporting(E_ALL); )
j'ai bien évidement essayé plusieurs pattern, mais celui ci-dessus me semble le plus proche du pattern final... celui qui va fonctionner ;)

un autre test consistait à faire :

$get_fichier = preg_replace('`MQCD\.1(.*)\</row\>`s' , '', $get_fichier);

et ici, il m'a bien supprimé de MQCD.1 à la dernière balise </row> du XML

Je suis complètement perdu avec les métacaractères, symboles, ancres, classes... plus je cherche, plus je m'y perds :(
Si quelqu'un pouvait me mettre sur la voie afin que je puisse comprendre le comportement de ce preg_replace et en particulier celui du patern, ce serait sympa.

PS : Un fichier xml complet : http://pastebin.com/m5e06c5bc

Hors ligne

#2 02-11-2009 14:49:14

Maskime
Membre
Lieu : Paris 15ème
Inscription : 11-05-2009
Messages : 134
Site Web

Re : [Résolu] Supprimer block dans fichier XML

Hello,

Passer par une regexp pour faire ce genre de tâche peut poser de sérieux problèmes (Tu sais pas trop ce qu'il peut y avoir dans ton fichier XML au fil du temps, il est possible que ton MQCD soit changé pour autre chose...)
Renseigne plutôt sur la librairie SimpleXML native à PHP, il y a une petite fonction qui s'appelle : simplexml_load_file() qui te permet de transformer un fichier XML en objet et de le manipuler par la suite...


La programmation est composée de 80% de réflexion pour 20% de syntaxe -> réfléchissez à votre problème par étapes

Recommande l'utilisation du pattern Singleton
Si jamais je poste un morceau de code pour vous aider, prenez bien compte que je n'ai pas forcément testé le code que je poste et qu'il est possible qu'il contienne des erreurs wink

Hors ligne

#3 02-11-2009 18:19:01

cramj
Membre
Inscription : 02-11-2009
Messages : 15

Re : [Résolu] Supprimer block dans fichier XML

Salut Maskime,
Le contenu du fichier XML est généré par moi même. C'est en fait un fichier .php généré par un autre fichier.
Je m'explique :
cron.php génère ./xml/2009-11-02.php qui au final contient :

<?php include 'haut.php' ?>
    <row>
      <string>MQCD.0</string>
...
...
      <number tooltip='0.42 joueur(s) sur MQCD.3 (23h)'>0.42</number>
    </row>
<?php include 'bas.php' ?>

et dans index.php, j'appelle le fichier ./xml/2009-11-02.php?paramOptionnel=val qui retourne du xml propre (j'utilise en fait ça → http://www.maani.us/xml_charts/ )

J'ai donc fait un test dans un fichier vierge :

<?php
if (file_exists('xml/2009-10-28.php')) {
    $xml = simplexml_load_file('xml/2009-10-28.php');
    print_r($xml);
} else {
    exit('Echec lors de l\'ouverture du fichier test.xml.');
}
?>

et l'erreur qui apparait :

Warning: simplexml_load_file() [function.simplexml-load-file]: xml/2009-10-28.php:28: parser error : Extra content at the end of the document in /home/*****/charts2/test.php on line 3

Warning: simplexml_load_file() [function.simplexml-load-file]: <row> in /home/****/charts2/test.php on line 3

Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in /home/****/charts2/test.php on line 3

et si je l'appelle avec le paramètre optionnel, il ne trouve pas le fichier hmm

Warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external entity "xml/2009-10-28.php?titre=test" in /home/****/charts2/test.php on line 3

Voilà, ça fait beaucoup de fichier.php include les uns dans les autres... sans doute l'origine de l'erreur.

Pour en revenir à ta remarque « il est possible que ton MQCD soit changé pour autre chose... », je te répondrai qu'il y a de forte chances que non. Sinon, faudrait changer le nom de domaine, le nom du clan (FPS), les serveurs de jeux... autrement dit le clan serait dissout ! et le script ne servirait plus à rien.

Donc aujourd'hui, même si ce n'est pas très propre/sécurisé/pro, je pense rester sur ma première idée : utiliser cette regex, et j'en aurai quasiment fini avec ce script wink
Sauf si tu arrives à me convaincre de changer mon point de vue...

Dernière modification par cramj (02-11-2009 18:21:06)

Hors ligne

#4 02-11-2009 19:04:08

cramj
Membre
Inscription : 02-11-2009
Messages : 15

Re : [Résolu] Supprimer block dans fichier XML

Peut-être un début de piste avec simplexml_load_string

<?php
if (file_exists('./xml/2009-10-28.php')) {
  ob_start();
  //~ include('./xml/2009-10-28.php');
  $xml =  file_get_contents('./xml/2009-10-28.php');
  echo $xml ;
  $ob = ob_get_contents();

  ob_end_clean();

  $xml =  simplexml_load_string($ob);
  print_r($xml);
} else {
  exit('Echec lors de l\'ouverture du fichier test.xml.');
}
?>

mais je n'arrive pas stocker la bonne chaine dans $ob

Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 28: parser error : Extra content at the end of the document in /home/***/charts2/test.php on line 11

Warning: simplexml_load_string() [function.simplexml-load-string]: <row> in /home/***/charts2/test.php on line 11

Warning: simplexml_load_string() [function.simplexml-load-string]: ^ in /home/***/charts2/test.php on line 11

Hors ligne

#5 03-11-2009 01:15:03

cramj
Membre
Inscription : 02-11-2009
Messages : 15

Re : [Résolu] Supprimer block dans fichier XML

À force d'y aller à tâtons et épluchant les explemples par ci par là, j'ai fini par trouver. Mais voilà le temps passé pour si peu sad

$get_fichier = preg_replace('#<row>
      <string>MQCD.1(.*)</row>#sUi'
, '', $get_fichier);


{édit} Je n'ai pas trouvé comment éditer le titre de ce fil afin d'ajouter « Résolu »

Dernière modification par cramj (03-11-2009 01:17:08)

Hors ligne

Pied de page des forums