Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/12/2007, 13h27   #1
Membre du Club
 
Avatar de Lost In Translation
 
Raphaël Deschler
Inscription : mai 2007
Messages : 166
Détails du profil
Informations personnelles :
Nom : Raphaël Deschler
Âge : 25
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : mai 2007
Messages : 166
Points : 55
Points : 55
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 :
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 :
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 :
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
Lost In Translation est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2007, 13h52   #2
Rédacteur/Modérateur
 
Avatar de MaitrePylos
 
Homme Gérard Ernaelsten
DBA & Dev PHP
Inscription : juin 2005
Messages : 3 182
Détails du profil
Informations personnelles :
Nom : Homme Gérard Ernaelsten
Âge : 39
Localisation : Belgique

Informations professionnelles :
Activité : DBA & Dev PHP
Secteur : Service public

Informations forums :
Inscription : juin 2005
Messages : 3 182
Points : 6 469
Points : 6 469
Bonjour
et comme ceci

Code :
1
2
3
 
 
private $MasquePseudo = "^<hr><b>(.*)</b>$";
MaitrePylos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2007, 14h25   #3
Membre du Club
 
Avatar de Lost In Translation
 
Raphaël Deschler
Inscription : mai 2007
Messages : 166
Détails du profil
Informations personnelles :
Nom : Raphaël Deschler
Âge : 25
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : mai 2007
Messages : 166
Points : 55
Points : 55
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)
Lost In Translation est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2007, 14h41   #4
Rédacteur/Modérateur
 
Avatar de MaitrePylos
 
Homme Gérard Ernaelsten
DBA & Dev PHP
Inscription : juin 2005
Messages : 3 182
Détails du profil
Informations personnelles :
Nom : Homme Gérard Ernaelsten
Âge : 39
Localisation : Belgique

Informations professionnelles :
Activité : DBA & Dev PHP
Secteur : Service public

Informations forums :
Inscription : juin 2005
Messages : 3 182
Points : 6 469
Points : 6 469
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 :
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
MaitrePylos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2007, 15h30   #5
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
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).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2007, 15h37   #6
Rédacteur/Modérateur
 
Avatar de MaitrePylos
 
Homme Gérard Ernaelsten
DBA & Dev PHP
Inscription : juin 2005
Messages : 3 182
Détails du profil
Informations personnelles :
Nom : Homme Gérard Ernaelsten
Âge : 39
Localisation : Belgique

Informations professionnelles :
Activité : DBA & Dev PHP
Secteur : Service public

Informations forums :
Inscription : juin 2005
Messages : 3 182
Points : 6 469
Points : 6 469
Heu le ereg, c'est juste pour faire des tests, et voir si il capture quelque chose
MaitrePylos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2007, 16h16   #7
Membre du Club
 
Avatar de Lost In Translation
 
Raphaël Deschler
Inscription : mai 2007
Messages : 166
Détails du profil
Informations personnelles :
Nom : Raphaël Deschler
Âge : 25
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : mai 2007
Messages : 166
Points : 55
Points : 55
Bon ben, je vais mettre les extraits si ça peut aider à voir plus clair...

parseur.class.php5
Code :
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 :
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 :
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.
Lost In Translation est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2007, 18h09   #8
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Avec vos exemple et masque, j'obtiens :
Code X :
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.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2007, 18h23   #9
Membre du Club
 
Avatar de Lost In Translation
 
Raphaël Deschler
Inscription : mai 2007
Messages : 166
Détails du profil
Informations personnelles :
Nom : Raphaël Deschler
Âge : 25
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : mai 2007
Messages : 166
Points : 55
Points : 55
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
Lost In Translation est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2007, 12h12   #10
Membre du Club
 
Avatar de Lost In Translation
 
Raphaël Deschler
Inscription : mai 2007
Messages : 166
Détails du profil
Informations personnelles :
Nom : Raphaël Deschler
Âge : 25
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : mai 2007
Messages : 166
Points : 55
Points : 55
Bonjour,

Suite au problème cité plus haut, comment pourrais-je capturer mon motif strict ?
Lost In Translation est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2007, 14h06   #11
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Je vous ai donné deux pistes :
  1. Etre plus strict sur les caractères acceptés entre vos balises <b> :
    Code :
    preg_match_all('`<hr><b>([^<>]*)</b>,`isU', $this->CodeHtml, $L_Captures);
  2. Ou une assertion, exemple :
    Code :
    preg_match_all('`<hr><b>((?:.(?<!<b>))*)</b>,`isU', $this->CodeHtml, $L_Captures);
A vous d'adapter suivant vos désirs/besoins.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2007, 15h10   #12
Membre du Club
 
Avatar de Lost In Translation
 
Raphaël Deschler
Inscription : mai 2007
Messages : 166
Détails du profil
Informations personnelles :
Nom : Raphaël Deschler
Âge : 25
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : mai 2007
Messages : 166
Points : 55
Points : 55
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
Lost In Translation est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h45.


 
 
 
 
Partenaires

Hébergement Web