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 :

preg_match_all : problème de capture [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre régulier Avatar de Lost In Translation
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 166
    Points : 89
    Points
    89
    Par défaut preg_match_all : problème de capture
    Bonjour à tous,

    Je créé un petit outil qui me permet de parser des pages que je consulte souvent pour ne récupérer que les infos qui m'intéresse.

    Dans le code source de la page, le pseudo des gens se trouve dans une séquence comme celle ci :

    J'ai fais une fonction qui me récupère tous les pseudos de la page avec un preg_split, histoire de compter. Le nombre retourné est juste.

    J'ai fais une fonction pour récupérer le pseudo avec preg_match_all... et c'est là que j'ai un soucis...

    voici la partie de mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private $MasquePseudo = '`<hr><b>(.+)</b>,`isU';
     
    public function DRCreerTableauPseudos()
      {
        $this->DRDebug("- Création d'un tableau contenant la liste des élements de la vue");
        //création des noms des personnages
        $this->DRDebug("-- Création de la liste des noms des personnages");
        preg_match_all($this->MasquePseudo,$this->CodeHtml,$L_Captures);
        $this->TableauVue["nom"] = $L_Captures[1];
    et le contenu de $L_Captures[1] n'est pas bon...

    Voici une rapide portion du rendu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    onmouseover=\"return overlib(\'&nbsp;&nbsp;&nbsp;&nbsp;<b>10 / 56 </b>&nbsp;&nbsp;&nbsp;&nbsp; distance : 3<br><hr><b>Soul
    Alors que la réponse attendue est seulement "Soul" (dernier mot de la ligne).

    donc si je fais un print_r($L_Captures[1]), ca me donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    array(
    [0]=> [plein de code qu'il ne devrait pas y avoir]LE_PSEUDO
    [1]=> [Encore du code qui ne devrait pas y avoir]LE_PSEUDO
    Avez vous une idée ?
    Est-ce mon masque qui est foireux ?
    Est-ce qu'il y a une erreur dans le code HTML de base (il fait pas loin de 2000 lignes... je le poste donc pas )

    Merci de vos futures aides

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Bonjour
    et comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    private $MasquePseudo = "^<hr><b>(.*)</b>$";

  3. #3
    Membre régulier Avatar de Lost In Translation
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 166
    Points : 89
    Points
    89
    Par défaut
    Le print_r me retourne un tableau vide...
    Alors que, pourtant, avec ^exp$ ça semble signifier "une chaine contenant exp"

    Le fait est que la page que je tente de parser tient sur "une seule ligne", est ce que ça pourrait venir de là ? (j'ai peur de polluer le forum si je poste le code source html)

  4. #4
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Le problème est que si tu retrouves plusieurs fois ce pattern, dans le code html, normalement il prendra le dernier.

    essaye avec un eregi pour voir su tu trouves quelques chose.

    le plus simple est de faire des test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $MasquePseudo = "^<hr><b>(.*)</b>$";
    $pseudo = "<hr><b>Maitrepylos</b>";
    eregi($MasquePseudo,$pseudo,$L_Captures);
     
    echo $L_Captures[1];
    Il faut bien sur adapter à ton code

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Citation Envoyé par MaitrePylos
    Le problème est que si tu retrouves plusieurs fois ce pattern, dans le code html, normalement il prendra le dernier.
    La fonction preg_match_all, et c'est là tout son intérêt, les capture toutes (en réalité c'est purement théorique car limitée). J'ajoute qu'il est vivement recommandé de ne plus utiliser les fonctions ereg* (dépréciées en quelque sorte).

    Sans source/exemple difficile de vous apporter une réponse, d'autant plus que votre précédent exemple est incomplet (un lien ou un extrait très limité et représentatif de la source serait la bienvenue), mais ça vient sans doute de votre motif (puisqu'il y figure déjà le modificateur de non gourmandise).

  6. #6
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Heu le ereg, c'est juste pour faire des tests, et voir si il capture quelque chose

  7. #7
    Membre régulier Avatar de Lost In Translation
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 166
    Points : 89
    Points
    89
    Par défaut
    Bon ben, je vais mettre les extraits si ça peut aider à voir plus clair...

    parseur.class.php5
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
     
    <?php
    class DRParseurCarteEW
    {
      /*************************/
      /***** Les variables *****/
      /*************************/
     
      private $AutoriserDebug = true;                                   //true = autoriser le debug dans le syslog 
                                                                        //false = ne pas autoriser le débug dans le syslog
     
      private $NumeroErreur;                                            //numéro de l'erreur en cours
      private $PageRetour = '<a href="index.html">Retour</a>';          //page de retour lors des erreurs;
      private $MasqueJoueur = '`<hr><b>(.+)</b>,`isU';   //masque des recherches joueurs
      //private $MasqueJoueur = '`&dest=(.+) target=f2`isU';
      private $MasqueNiveau = '`<u>Niveau :</u> <b>(.+)</b>`isU';
      private $MasqueAlignement = '`</b>, (.+) <br><u>Niveau :</u>`isU';
      private $MasqueFamilier = '`<b>Familier : </b>(.+)*<br><u>Proprio :</u> (.+)<br><u>lvl :</u> (.+)<br>`isU';     //masque des recherches familiers
      private $MasqueMonstre = '`<b>Monstre : </b>(.+)*<br><u>Niveau :</u> (.+)`isU';                                 //masque des recherches monstres
      private $TableauVue = array();                                    //tableau de la vue;
      /***************************/
      /***** Le constructeur *****/
      /***************************/
     
      public function __construct($A_POST)
      {
        $this->CodeHtml = $A_POST;
     
        //on initialise le tableau de vue
        $this->DRCreerTableauJoueurs();
      }
     
      /************************/
      /***** Les méthodes *****/
      /************************/
     
      private function DRDebug($A_Texte)
      {
        if($this->AutoriserDebug)
          syslog(LOG_DEBUG, 'Carte EpicWar -  parseur.class.php : '.$A_Texte);
      }
     
      public function DRRetournerErreur()
      {
        if($this->NumeroErreur == 1)
        {
          echo "<p>Le formulaire est vide. Veuillez renseigner les informations.<br />".$this->PageRetour."</p>";
          exit();
        }
        elseif($this->NumeroErreur == 2)
        {
          echo "<p>Il n'y a pas de personnages dans la vue.<br>".$this->PageRetour."</p>";
        }
      }
     
      public function DRVeriferFormulaire()
      {
        //je vérifie que le formulaire n'est pas posté vide.
        $this->DRDebug("- On vérifie que le formulaire n'est pas vide");
        if(empty($this->CodeHtml))
        {
          $this->DRDebug("-- Le formulaire est vide, on affiche un message d'erreur");
          $this->NumeroErreur = 1;
          return false;
        }
        else
        {
          $this->DRDebug("-- Le formulaire n'est pas vide, on continue");
          return true;
        }
      }
     
      public function DRTrouverPersonnages()
      {
        $this->DRDebug("- Nous cherchons s'il y a des personnages dans la vue");
        if(preg_match($this->MasqueJoueur,$this->CodeHtml) || preg_match($this->MasqueFamilier,$this->CodeHtml) || preg_match($this->MasqueMonstre,$this->CodeHtml))
        {
          $this->DRDebug('-- Il y a des personnages dans la vue');
          return true;
        }
        else
        {
          $this->DRDebug('-- Il n\'y a pas de personnages dans la vue');
          $this->NumeroErreur = 2;
        }
      }
     
      public function DRNombreJoueurs()
      {
        $this->DRDebug("- Nous cherchons à compter le nombre de joueurs dans la vue");
        $L_Split = preg_split($this->MasqueJoueur,$this->CodeHtml);
        return count($L_Split)-1;
      }
     
      public function DRNombreFamiliers()
      {
        $this->DRDebug("- Nous cherchons à compter le nombre de familiers dans la vue");
        $L_Split = preg_split($this->MasqueFamilier,$this->CodeHtml);
        return count($L_Split)-1;
      }
     
      public function DRNombreMonstres()
      {
        $this->DRDebug("- Nous cherchons à compter le nombre de monstres dans la vue");
        $L_Split = preg_split($this->MasqueMonstre,$this->CodeHtml);
        return count($L_Split)-1;
      }
     
      public function DRCreerTableauJoueurs()
      {
        $this->DRDebug("- Création d'un tableau contenant la liste des élements de la vue");
        //création des noms des personnages
        $this->DRDebug("-- Création de la liste des noms des personnages");
        preg_match_all($this->MasqueJoueur,$this->CodeHtml,$L_Captures);
        $this->TableauVue["nom"] = $L_Captures[1];
     
        print_r($L_Captures[1]);
        /*$L_TableauTemporaire = array_unique($L_Captures[1]);
        $L_i = 0;
        foreach($L_TableauTemporaire as $L_Ligne)
        {
          $this->TableauVue["nom"][$L_i] = $L_Ligne;
          $L_i++;
        }*/
     
        /*//création des niveaux des personnages;
        $this->DRDebug("-- Création de la liste des noms des personnages");
        preg_match_all($this->MasqueNiveau,$this->CodeHtml,$L_Captures);
        $this->TableauVue["niveau"] = $L_Captures[1];
        
        //création des alignement des personnages;
        $this->DRDebug("-- Création de la liste des alignements des personnages");
        preg_match_all($this->MasqueAlignement,$this->CodeHtml,$L_Captures);
        $this->TableauVue["alignement"] = $L_Captures[1];*/
     
      }
     
     public function DRConvertirTableauJoueursTexte()
     {
       $L_i = 0;
       while($L_i < count($this->TableauVue["nom"]))
       {
         echo "<b>".$this->TableauVue["nom"][$L_i]."</b> est de niveau <b>".$this->TableauVue['niveau'][$L_i]."</b> est d'alignement <b>".$this->TableauVue["alignement"][$L_i]."</b><br>";
         $L_i++;
       }
     }
     
    }
    parser_carte.php5
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    <?php
    /**************************/
    /***** Les inclusions *****/
    /**************************/
     
    include('libs/parseur.class.php5');
     
    /*************************/
    /***** Instanciation *****/
    /*************************/
     
    $DRPCEW = new DRParseurCarteEW($_POST['codehtml']);
     
    /*****************/
    /***** DEBUT *****/
    /*****************/
     
    if(!$DRPCEW->DRVeriferFormulaire())
      $DRPCEW->DRRetournerErreur();
    else
    {
      echo "Code fourni non vide : OK<br><br>";
    }
     
    if(!$DRPCEW->DRTrouverPersonnages())
      $DRPCEW->DRRetournerErreur();
    else
      echo "joueurs trouvés : OK<br><br>";
     
    echo "Nombre de joueurs : ".$DRPCEW->DRNombreJoueurs()."<br>";
    echo "Nombre de familiers : ".$DRPCEW->DRNombreFamiliers()."<br>";
    echo "Nombre de monstres : ".$DRPCEW->DRNombreMonstres()."<br><br>";
     
    //$DRPCEW->DRConvertirTableauJoueursTexte();
    /***************/
    /***** FIN *****/
    /***************/
    ?>
    code à parser (attention les yeux :p)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <a class=cl style="left:270;top:100" href=javascript:void(0); onclick="return overlib('<b>Action :</b> <LI>déplacement impossible</a><li><a href=mouv_pet.php?xdest=3&ydest=54 target=f2>Déplacer votre familier ici</a><li><a href=choix_ench.php?t=0&d=3&xc=3&yc=54&idc=0 target=f2>Enchanter</a>',STICKY, CAPTION,'3 / 54 &nbsp;&nbsp;&nbsp;&nbsp; distance : 3',FGCOLOR,'#CCCCFF');" onmouseover="return overlib('&nbsp;&nbsp;&nbsp;&nbsp;<b>3 / 54 </b>&nbsp;&nbsp;&nbsp;&nbsp; distance : 3<br><hr>Coût minimal du déplacement : 12 PA',FGCOLOR, '#777777');" onmouseout="return nd();"><img class=bg src="img/t2/0.gif"/><img class=ov src="img/n/n0.png"/></a><a class=cl style="left:310;top:100" href=javascript:void(0); onclick="return overlib('<b>Action :</b><LI><a href=choix_ench.php?t=1&d=3&xc=4&yc=54&idc=14544 target=f2>Enchanter</a><LI><a href=att_neige.php?xc=4&yc=54&d=3&idc=14544&t=p target=f2>Lancer une boule (1PA)</a><li><a href=msg_frame.php?x=2&dest=Henoula target=f2>Message</a><li><a href=rp_show.php?idc=14544 target=f2>Consulter son profil</a>',STICKY, CAPTION,'4 / 54 &nbsp;&nbsp;&nbsp;&nbsp; distance : 3',FGCOLOR,'#CCCCFF');" onmouseover="return overlib('&nbsp;&nbsp;&nbsp;&nbsp;<b>4 / 54 </b>&nbsp;&nbsp;&nbsp;&nbsp; distance : 3<br><hr><b>Henoula</b>, Invocateur Elfe <br><u>Niveau :</u> <b>17</b><br><u>Escouade :</u> Oskorei<br><u>Pv :</u> 342 / 350<hr><u>Enchantement(s) actif(s) :</u> <br><img src=img/s/resist.gif>&nbsp;21/12 à 09:34<hr><b>Message allié :</b> kalulu 4PO. neph 2PO FEANOR 2PO Andro 6PO YGOLONAC+16 GLADI 3PO MERWYN 3PO SOUL 3PO',FGCOLOR, '#CCFFFF');" onmouseout="return nd();"><img class=bg src="img/t2/0.gif"/><img class=pj src="img/p/0/2/1_12.gif" width=40/><img class=ov src="img/n/n0.png"/></a><a class=cl style="left:350;top:100" href=javascript:void(0); onclick="return overlib('<b>Action :</b><LI><a href=att_neige.php?xc=5&yc=54&d=3&idc=14544&t=a target=f2>Lancer une boule (1PA)</a><li><a href=msg_frame.php?x=2&dest=Henoula target=f2>Message au propriétaire</a>',STICKY, CAPTION,'5 / 54 &nbsp;&nbsp;&nbsp;&nbsp; distance : 3',FGCOLOR,'#CCCCFF');" onmouseover="return overlib('&nbsp;&nbsp;&nbsp;&nbsp;<b>5 / 54 </b>&nbsp;&nbsp;&nbsp;&nbsp; distance : 3<br><hr><b>Familier : </b>Nymphe des eaux (Elfe)<br><u>Proprio :</u> Henoula<br><u>lvl :</u> 17<br><u>Pv :</u> 350 / 350<u><hr>Enchantement(s) actif(s) :</u> ',FGCOLOR, '#CCDDDD');" onmouseout="return nd();"><img class=bg src="img/t2/0.gif"/><img class=pj src="img/a/23.gif" width=40/><img class=ov src="img/n/n0.png"/></a><a class=cl style="left:390;top:100" href=javascript:void(0); onclick="return overlib('<b>Action :</b><LI><a href=choix_ench.php?t=1&d=4&xc=6&yc=54&idc=15618 target=f2>Enchanter</a><LI><a href=att_neige.php?xc=6&yc=54&d=4&idc=15618&t=p target=f2>Lancer une boule (1PA)</a><li><a href=msg_frame.php?x=2&dest=Vraenor target=f2>Message</a><li><a href=rp_show.php?idc=15618 target=f2>Consulter son profil</a>',STICKY, CAPTION,'6 / 54 &nbsp;&nbsp;&nbsp;&nbsp; distance : 4',FGCOLOR,'#CCCCFF');" onmouseover="return overlib('&nbsp;&nbsp;&nbsp;&nbsp;<b>6 / 54 </b>&nbsp;&nbsp;&nbsp;&nbsp; distance : 4<br><hr><b>Vraenor</b>, Invocateur Elfe <br><u>Niveau :</u> <b>13</b><br><u>Escouade :</u> Oskorei<br><u>Pv :</u> 300 / 300<hr><b>Message allié :</b> soigneur des po svp  1po/20 !',FGCOLOR, '#CCFFFF');" onmouseout="return nd();"><img class=bg src="img/t2/0.gif"/><img class=pj src="img/p/0/2/0_12.gif" width=40/><img class=ov src="img/n/n0.png"/></a><

    En m'excusant si c'est parfaitement illisible pour le code html (l'ensemble de la page de base tient sur une ligne. Et si je mets des sauts de ligne pour rendre la source lisible, les masques ne sont plus les mêmes)

    Notez que la fonction DRNombreJoueurs() marche parfaitement avec le preg_split. A noter aussi que le code est envoyé en POST (je ne mets donc pas le formulaire qui pointe sur parser_carte.php5). Ce n'est donc qu'une portion

    PS : Le texte que vous avez entré est trop long (89870 caractères). Veuillez le raccourcir à 30000 caractères.

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Avec vos exemple et masque, j'obtiens :
    Code X : 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
    Array
    (
        [0] => Array
            (
                [0] => <hr><b>Le_pseudo1</b>,
                [1] => <hr><b>Le_pseudo2</b>,
                [2] => <hr><b>Le_pseudo3</b>,
                [3] => <hr><b>Henoula</b>,
                [4] => <hr><b>Message allié :</b> kalulu 4PO. neph 2PO FEANOR 2PO Andro 6PO YGOLONAC+16 GLADI 3PO MERWYN 3PO SOUL 3PO',FGCOLOR, '#CCFFFF');" onmouseout="return nd();"><img class=bg src="img/t2/0.gif"/><img class=pj src="img/p/0/2/1_12.gif" width=40/><img class=ov src="img/n/n0.png"/></a><a class=cl style="left:350;top:100" href=javascript:void(0); onclick="return overlib('<b>Action :</b><LI><a href=att_neige.php?xc=5&yc=54&d=3&idc=14544&t=a target=f2>Lancer une boule (1PA)</a><li><a href=msg_frame.php?x=2&dest=Henoula target=f2>Message au propriétaire</a>',STICKY, CAPTION,'5 / 54 &nbsp;&nbsp;&nbsp;&nbsp; distance : 3',FGCOLOR,'#CCCCFF');" onmouseover="return overlib('&nbsp;&nbsp;&nbsp;&nbsp;<b>5 / 54 </b>&nbsp;&nbsp;&nbsp;&nbsp; distance : 3<br><hr><b>Familier : </b>Nymphe des eaux (Elfe)<br><u>Proprio :</u> Henoula<br><u>lvl :</u> 17<br><u>Pv :</u> 350 / 350<u><hr>Enchantement(s) actif(s) :</u> ',FGCOLOR, '#CCDDDD');" onmouseout="return nd();"><img class=bg src="img/t2/0.gif"/><img class=pj src="img/a/23.gif" width=40/><img class=ov src="img/n/n0.png"/></a><a class=cl style="left:390;top:100" href=javascript:void(0); onclick="return overlib('<b>Action :</b><LI><a href=choix_ench.php?t=1&d=4&xc=6&yc=54&idc=15618 target=f2>Enchanter</a><LI><a href=att_neige.php?xc=6&yc=54&d=4&idc=15618&t=p target=f2>Lancer une boule (1PA)</a><li><a href=msg_frame.php?x=2&dest=Vraenor target=f2>Message</a><li><a href=rp_show.php?idc=15618 target=f2>Consulter son profil</a>',STICKY, CAPTION,'6 / 54 &nbsp;&nbsp;&nbsp;&nbsp; distance : 4',FGCOLOR,'#CCCCFF');" onmouseover="return overlib('&nbsp;&nbsp;&nbsp;&nbsp;<b>6 / 54 </b>&nbsp;&nbsp;&nbsp;&nbsp; distance : 4<br><hr><b>Vraenor</b>,
            )
        [1] => Array
            (
                [0] => Le_pseudo1
                [1] => Le_pseudo2
                [2] => Le_pseudo3
                [3] => Henoula
                [4] => Message allié :</b> kalulu 4PO. neph 2PO FEANOR 2PO Andro 6PO YGOLONAC+16 GLADI 3PO MERWYN 3PO SOUL 3PO',FGCOLOR, '#CCFFFF');" onmouseout="return nd();"><img class=bg src="img/t2/0.gif"/><img class=pj src="img/p/0/2/1_12.gif" width=40/><img class=ov src="img/n/n0.png"/></a><a class=cl style="left:350;top:100" href=javascript:void(0); onclick="return overlib('<b>Action :</b><LI><a href=att_neige.php?xc=5&yc=54&d=3&idc=14544&t=a target=f2>Lancer une boule (1PA)</a><li><a href=msg_frame.php?x=2&dest=Henoula target=f2>Message au propriétaire</a>',STICKY, CAPTION,'5 / 54 &nbsp;&nbsp;&nbsp;&nbsp; distance : 3',FGCOLOR,'#CCCCFF');" onmouseover="return overlib('&nbsp;&nbsp;&nbsp;&nbsp;<b>5 / 54 </b>&nbsp;&nbsp;&nbsp;&nbsp; distance : 3<br><hr><b>Familier : </b>Nymphe des eaux (Elfe)<br><u>Proprio :</u> Henoula<br><u>lvl :</u> 17<br><u>Pv :</u> 350 / 350<u><hr>Enchantement(s) actif(s) :</u> ',FGCOLOR, '#CCDDDD');" onmouseout="return nd();"><img class=bg src="img/t2/0.gif"/><img class=pj src="img/a/23.gif" width=40/><img class=ov src="img/n/n0.png"/></a><a class=cl style="left:390;top:100" href=javascript:void(0); onclick="return overlib('<b>Action :</b><LI><a href=choix_ench.php?t=1&d=4&xc=6&yc=54&idc=15618 target=f2>Enchanter</a><LI><a href=att_neige.php?xc=6&yc=54&d=4&idc=15618&t=p target=f2>Lancer une boule (1PA)</a><li><a href=msg_frame.php?x=2&dest=Vraenor target=f2>Message</a><li><a href=rp_show.php?idc=15618 target=f2>Consulter son profil</a>',STICKY, CAPTION,'6 / 54 &nbsp;&nbsp;&nbsp;&nbsp; distance : 4',FGCOLOR,'#CCCCFF');" onmouseover="return overlib('&nbsp;&nbsp;&nbsp;&nbsp;<b>6 / 54 </b>&nbsp;&nbsp;&nbsp;&nbsp; distance : 4<br><hr><b>Vraenor
            )
    )
    Or vous remarquerez que la dernière capture a lieu parce qu'elle réunit les balises <hr> et <b> mais qu'il n'y a pas de virgule après la première </b> donc il est bien obligé d'attendre de trouver les deux (un autre </b> immédiatement suivi de ,) avant de décider de la fin de celle-ci. En remplaçant simplement . par [^<>], par exemple et si c'est acceptable, vous permettrait de ne pas prendre en compte ces éléments "parasites" (au pire il y a les assertions).

    PS : je ne me suis pas intéressé au code PHP.

  9. #9
    Membre régulier Avatar de Lost In Translation
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 166
    Points : 89
    Points
    89
    Par défaut
    Et bien voyez-vous, vous venez de m'apprendre quelque chose, la façon dont php utilise les expressions rationnelles.

    Je pensais qu'en fait il cherchait le motif et qu'en suite il faisait une capture entre Début et Fin.

    En fait, il cherche Début, puis capture tout jusqu'à tomber sur Fin. Je vous avouerais que du coup, je comprends les erreurs que me sortent le code.

    Mais, je ne sais comment y pallier. Sauriez-vous m'aiguiller/m'aider/me donner la solution ? Ce n'est pas que je ne souhaite pas chercher, loin de là, mais j'ai beaucoup à faire là dessus pour peu de temps

  10. #10
    Membre régulier Avatar de Lost In Translation
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 166
    Points : 89
    Points
    89
    Par défaut
    Bonjour,

    Suite au problème cité plus haut, comment pourrais-je capturer mon motif strict ?

  11. #11
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Je vous ai donné deux pistes :
    1. Etre plus strict sur les caractères acceptés entre vos balises <b> :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      preg_match_all('`<hr><b>([^<>]*)</b>,`isU', $this->CodeHtml, $L_Captures);
    2. Ou une assertion, exemple :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      preg_match_all('`<hr><b>((?:.(?<!<b>))*)</b>,`isU', $this->CodeHtml, $L_Captures);

    A vous d'adapter suivant vos désirs/besoins.

  12. #12
    Membre régulier Avatar de Lost In Translation
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 166
    Points : 89
    Points
    89
    Par défaut
    J'avoue que je ne connaissais pas les expressions régulières si profondément !

    La notion d'assertion m'était parfaitement méconnue.
    Merci énormément, je vais de ce pas approfondir mes connaissances et finir mon script

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 01/07/2011, 16h44
  2. Problème de capture de vidéo non compressée
    Par visio dans le forum OpenCV
    Réponses: 7
    Dernier message: 18/02/2008, 09h45
  3. Problème de capture de la souris
    Par Teaniel dans le forum C++Builder
    Réponses: 0
    Dernier message: 27/10/2007, 19h07
  4. Problème outil capture Windows Vista
    Par Pierre5902 dans le forum Windows Vista
    Réponses: 5
    Dernier message: 26/09/2007, 11h02
  5. problème de capture son avec Directshow
    Par albator83 dans le forum DirectX
    Réponses: 2
    Dernier message: 06/11/2003, 17h18

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