IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Analyser du contenu HTML [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 18
    Points : 10
    Points
    10
    Par défaut Analyser du contenu HTML
    Bonjour tout le monde !

    Voilà je galère depuis pas mal de jours maintenant pour parvenir à analyser un bout de code HTML via une regexp afin de retourner les résultats dans un tableau PHP.

    Donc le code source HTML à analyser (c'est pour un jeu) est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
       <b style="text-transform:lowercase">6 Objets</b>
                    <div class="vert">+60 force</div>          
                    <div class="jaune">+40 magie</div>          
                    <div class="vert">+20 soins</div>          
                    <div class="jaune">+10 rapidité</div>          
       <b style="text-transform:lowercase">5 Objets</b>
                  <div class="vert">+40 force</div>          
                  <div class="jaune">+40 magie</div>          
                  <div class="vert">+4 rapidité</div>
       <b style="text-transform:lowercase">4 Objets</b>
                  <div class="vert">+30 force</div>          
                  <div class="jaune">+30 magie</div>          
                  <div class="vert">+4 rapidité</div>
    <div class="part_bottom"></div>
    Je voudrais faire un regexp qui me donne un tableau mutlidimensionnel avec pour chaque cellule: le nombre d'objets, une liste d'effets, une liste de valeurs pour les effets.
    Pour l'exemple de code ci-dessus on aurait donc:
    Tab[0] = Array(6, force:magie:soins:rapidité, 60:40:20:10)
    Tab[1] = Array(5, force:magie:rapidité, 40:40:4)
    Tab[2] = Array(4, force:magie:rapidité, 30:30:4)

    J'ai séparé les listes par un ":" que je pourrais construire via un implode().
    Donc voilà mon problème.

    J'ai essayé plein de regexp différentes mais je bloque.
    Voilà ce que j'ai fait pour le moment:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    //on récupère le nombre d'items
    $res = preg_match_all('#<b style="text-transform:lowercase">(\d+)[^<]*</b>#U', $html, $nb_items, PREG_SET_ORDER);
     
    //on récupère les effets et les valeurs
    foreach ($nb_items as $val)
    {
        $Tab[] = $val[1];
        $a = $val[1];
     
        $res = preg_match_all('#<b style="text-transform:lowercase">'.$a.'[^<]*</b>\s+(<div class="(vert|jaune)">([^<]*)</div>\s+)+#U', $html, $effets, PREG_SET_ORDER);
     
      foreach ($effets[2] as $un_effet)
      { 
          $str = $un_effet[1];
     
          if (preg_match("#[+]?([-]?\d+) force#i", $str, $x)) {
            $my_effet[0][$i] = "force";
            $my_effet[1][$i] = $x[1];
     
         etc ...
       }
       $Tab[][1] = implode(":",$my_effet[0]);
       $Tab[][2] = implode(":",$my_effet[1]);
    }
    Bon ça me renvoit juste le 1er effet mais pas les effets concaténés avec un ":"

    Pour ceux qui auront le courage de me lire, merci infiniment pour votre aide !!!!!

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 359
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 359
    Points : 15 705
    Points
    15 705
    Par défaut
    affiche le contenu de $effets tu verras que tu n'obtiens pas ce que tu essaye d'analyser

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Merci pr le tuyau !
    Effectivement ça ne me retourne pas ce que je veux.
    J'ai modifié la 2ème regexp, celle qui retourne $effets pour enlever le U (mode Ungreedy) et un var_dump($effets) me renvoie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    array(3) {
      [0]=> string(318) "4 Objets
                                +60 force
                                +40 magie
                                +20 soins
                                +10 rapidité"
      [1]=> string(70) "+10 rapidité"
      [2]=> string(1) "é"
    } 
    etc ...
    Le problème c'est que je ne sais pas comment récupérer le code pour chacune des combinaisons d'objets (6 objets, 5 objets, etc), c'est à dire pouvoir lire et mettre dans un tableau chaque "sous-groupe HTML" composé de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <b style="text-transform:lowercase">X Objets</b>
                    <div class="vert">...</div>          
                    <div class="jaune">...</div>

    Merci...

  4. #4
    Membre actif Avatar de John Blobsmith
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 198
    Points : 223
    Points
    223
    Par défaut
    Alors...

    Mise en tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $arrTmpGroup = explode('<b style="text-transform:lowercase">',$html);
    $arrGroup = array();
    $arrSubGroup = array();
    foreach($arrTmpGroup as $group){
      if($group){
        $arrSubGroup = explode('">',$group);
        $arrGroup[] = $arrSubGroup;
      }
    }
    nettoyage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    foreach($arrGroup as $k => $group){
      foreach($group as $kk => $subGroup){  
        if($kk == 0)
          $subGroup = preg_replace('#[^0-9+]#isU', '', $subGroup);
        else
          $subGroup = preg_replace('#^\+([0-9]+) (.+)</div>(.+)$#isU', '$1 $2', $subGroup);
        $arrGroup[$k][$kk] = $subGroup;
      }
    }
    finission
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    $tab = array();
    foreach($arrGroup as $k => $group){
      $bolFirst = true;
      foreach($group as $key => $subGroup){
        if($key == 0)
          $tab[$k][0] = $subGroup;
        else{
          if(!$bolFirst){
            $tab[$k][1] = $tab[$k][1].':';
            $tab[$k][2] = $tab[$k][2].':';
          }
          else{
            $tab[$k][1] = '';
            $tab[$k][2] = '';
          }
     
          $arrTmp = explode(' ',$subGroup);
          if(isset($arrTmp[1])){
            $tab[$k][1] = $tab[$k][1].$arrTmp[1];
            $tab[$k][2] = $tab[$k][2].$arrTmp[0];
          }
          $bolFirst = false;
        }
      }
    }
    Affichage

  5. #5
    Membre actif Avatar de John Blobsmith
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 198
    Points : 223
    Points
    223
    Par défaut
    En plus dense :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    preg_match_all('#lowercase">([0-9]+) Objets#',$str, $resultGroup);
     
    $arrTmp = explode('<b style="text-transform:lowercase">',$str);
    unset($arrTmp[0]);
    $arrResult = array();
    $i=0;
    foreach($arrTmp as $tmpStr){
      preg_match_all('#>.([0-9]+) [^<]+</div>#',$tmpStr, $resultSubGroupNum);
      preg_match_all('#>.[0-9]+ ([^<]+)</div>#',$tmpStr, $resultSubGroupLegende);
     
      $arrResult[$i][] = $resultGroup[1][$i];
      $arrResult[$i][] = implode(':',$resultSubGroupLegende[1]);
      $arrResult[$i][] = implode(':',$resultSubGroupNum[1]);
      $i++;
    }
     
    print_r($arrResult);
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    [0] => Array
            (
                [0] => 6
                [1] => force:magie:soins:rapidité
                [2] => 60:40:20:10
            )
     
        [1] => Array
            (
                [0] => 5
                [1] => force:magie:rapidité
                [2] => 40:40:4
            )
     
        [2] => Array
            (
                [0] => 4
                [1] => force:magie:rapidité
                [2] => 30:30:4
            )

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Arf je n'avais pas pensé au:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    explode('<b style="text-transform:lowercase">',$html);
    pour récupérer les sous-groupes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <b style="text-transform:lowercase">X Objets</b>
                    <div class="vert">...</div>          
                    <div class="jaune">...</div>
    et les mettre dans un tableau...
    Ca me parait tellement évident maintenant.
    Merci milles fois blobus, cela faisait longtemps que je butais sur ce problème

    Au plaisir

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Analyse de site et de contenu html
    Par Ezenkiel dans le forum Langage
    Réponses: 0
    Dernier message: 31/01/2013, 13h45
  2. [RegEx] Analyser contenu html
    Par benjisan dans le forum Langage
    Réponses: 4
    Dernier message: 27/01/2009, 09h27
  3. [FLASH MX] Scrollbar et contenu Html externe
    Par efrenik dans le forum Flash
    Réponses: 9
    Dernier message: 21/08/2006, 16h39
  4. Analyse de code HTML et simplification par l'XML
    Par Punky65250 dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 10/11/2005, 10h24
  5. Analyse de code HTML en réponse a une requête post.
    Par ghost942 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 04/06/2005, 21h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo