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 11/07/2008, 13h52   #1
Invité de passage
 
Inscription : octobre 2004
Messages : 9
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 9
Points : 0
Points : 0
Par défaut Probleme de parsing

bonjour,
je souhaite parser une page html avec le code ci-dessous :

Lorsque j'ai qu'une seule réponse, cela marche très bien, par contre dès que j'ai deux réponse, il me prend tout ce qu'il y a entre les deux.
Pouvez vous m'aider s'il vous plait.

Merci


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$fp = fopen("C:\Documents and Settings\Loïc\Bureau\SGBD\www_fftt_com - Classement.htm","r"); //lecture du fichier
while (!feof($fp)) { //on parcourt toutes les lignes
  $page .= fgets($fp, 4096); // lecture du contenu de la ligne
 
 
}
$titre = eregi("<td ALIGN='LEFT' bgcolor='#EBEBEB'><font size=2><a href='(.*)</font></a></td>",$page,$regs); //on isole ce que je veux parser
//echo $regs[1];  
 
print $titre;
 
 
fclose($fp);
 
?>
the--first est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2008, 14h11   #2
Membre émérite
 
Assistant recherche bioinfo
Inscription : novembre 2007
Messages : 805
Détails du profil
Informations personnelles :
Localisation : Canada

Informations professionnelles :
Activité : Assistant recherche bioinfo

Informations forums :
Inscription : novembre 2007
Messages : 805
Points : 830
Points : 830
ton motif est .*
Ce qui veut dire que il va essayer de prendre un maximum de caracteres jusqu'a </font>. Autrement dit, si il trouve plusieurs </fond>, il prendra le dernier pour avoir la plus grande sequence possible qui convient.

Utilise le greedy mode, ou recherche 'tous les carcteres sauf' pour stoper la rechercher de la chaine plus tot.

Z.
Zwiter est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2008, 14h13   #3
Membre du Club
 
Étudiant
Inscription : juillet 2008
Messages : 53
Détails du profil
Informations personnelles :
Âge : 21
Localisation : France, Somme (Picardie)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2008
Messages : 53
Points : 46
Points : 46
Envoyer un message via MSN à paul-h
Bonjour,

Plusieurs choses :

1°) Utilises la balise pour inserer ton code stp.

2°) Il faudrait que tu donne plus d'indication sur la fonction de ton code, car là hormis le fait que ce soit illisible du fait de la non-coloration, je ne vois pas quel est le but du script.

Merci d'avance, Paul-H
paul-h est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2008, 14h34   #4
Invité de passage
 
Inscription : octobre 2004
Messages : 9
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 9
Points : 0
Points : 0
Désoler pour ne pas avoir mis les balises, je suis nouveau ici donc j'ai pas l'habitude.
Merci pour vos réponses rapides.
Quel serait le code alors pour qu'il ne s'arrete pas au dernier </font> qu'il trouve mais au premier?

Encore merci pour votre aide, c'est vraiment sympa.


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
<html><body>
 
 
<?php
//j'ouvre la page que je veux parser.
$fp = fopen("C:\Documents and Settings\Loïc\Bureau\SGBD\www_fftt_com - Classement.htm","r"); //lecture du fichier
while (!feof($fp)) { //on parcourt toutes les lignes
  $page .= fgets($fp, 4096); // lecture du contenu de la ligne
 
 
}
//Le code html que je veux parser se trouve juste après : td ALIGN='LEFT' bgcolor='#EBEBEB'><font size=2><a href=' et juste avant le premier /font></a></td> qu'il trouvera dans le code.
 
$titre = eregi("<td ALIGN='LEFT' bgcolor='#EBEBEB'><font size=2><a href='(.*)</font></a></td>",$page,$regs); //on isole la partie du code qui m'interesse.
echo $regs[1];  
 
 
 
 
fclose($fp);
 
?>
</body>
</html>
the--first est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2008, 14h47   #5
Membre émérite
 
Assistant recherche bioinfo
Inscription : novembre 2007
Messages : 805
Détails du profil
Informations personnelles :
Localisation : Canada

Informations professionnelles :
Activité : Assistant recherche bioinfo

Informations forums :
Inscription : novembre 2007
Messages : 805
Points : 830
Points : 830
Code :
1
2
3
4
5
6
7
<?php
$titre = eregi("<td ALIGN='LEFT' bgcolor='#EBEBEB'><font size=2><a href='(.*?)</font></a></td>",$page,$regs); //greedy mode
 
//ou
$titre = eregi("<td ALIGN='LEFT' bgcolor='#EBEBEB'><font size=2><a href='([^<]*)</font></a></td>",$page,$regs); //tout sauf '<' donc des qu'il rencontre le 1er </font>, l'accumulation de la chaine est stoppee
 
?>
Zwiter est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2008, 15h06   #6
Invité de passage
 
Inscription : octobre 2004
Messages : 9
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 9
Points : 0
Points : 0
Merci beaucoup pour la réponse, la première avec le "?" ne fonctionne pas mais par contre, la deuxième solution marche très bien.

Il me reste un dernier soucis, comment faire pour qu'il continu dans la page et me fasse la liste des autres expressions qui correspondent aux conditions. (affichage sous forme de tableau par exemple).

Merci encore.
the--first est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2008, 15h35   #7
Membre émérite
 
Assistant recherche bioinfo
Inscription : novembre 2007
Messages : 805
Détails du profil
Informations personnelles :
Localisation : Canada

Informations professionnelles :
Activité : Assistant recherche bioinfo

Informations forums :
Inscription : novembre 2007
Messages : 805
Points : 830
Points : 830
je ne connais pas les ereg, mais avec les fonctions preg, preg_match permet de recuperer les resultats.
Z.
Zwiter est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2008, 15h56   #8
Invité de passage
 
Inscription : octobre 2004
Messages : 9
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 9
Points : 0
Points : 0
Et dans ce cas la, cela donnerai quoi si j'utilisai preg ou preg_match?


Merci
the--first est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2008, 16h08   #9
Membre émérite
 
Assistant recherche bioinfo
Inscription : novembre 2007
Messages : 805
Détails du profil
Informations personnelles :
Localisation : Canada

Informations professionnelles :
Activité : Assistant recherche bioinfo

Informations forums :
Inscription : novembre 2007
Messages : 805
Points : 830
Points : 830
Je me suis tromper, il faut preg_match_all.
je te conseil de te renseigner sur cette fonction sur le site php.net, ca sera plus complet que tout ce que je pourrai te dire. (pis bon, un peu de lecture ne fais pas de mal )
L'idee est de recuperer toutes les occurences dans un tableau.
Z.
Zwiter est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2008, 16h40   #10
Invité de passage
 
Inscription : octobre 2004
Messages : 9
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 9
Points : 0
Points : 0
je viens de regarder sur le net la fonction et honettement, j'ai vachement de mal.... je comprend pas grand chose au fonctionnement...
C'est long a transformé ma fonction... ca fait des jours que je bloque dessus je commence a en avoir marre.. lol

Encore merci pour ton aide Zwiter
the--first est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2008, 16h53   #11
Membre émérite
 
Assistant recherche bioinfo
Inscription : novembre 2007
Messages : 805
Détails du profil
Informations personnelles :
Localisation : Canada

Informations professionnelles :
Activité : Assistant recherche bioinfo

Informations forums :
Inscription : novembre 2007
Messages : 805
Points : 830
Points : 830
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
$string = "<td ALIGN='LEFT' bgcolor='#EBEBEB'><font size=2><a href='blabla'></font></a></td>";
$string .= "<td ALIGN='LEFT' bgcolor='#EBEBEB'><font size=2><a href='toto'></font></a></td>";
$titre = preg_match_all("@<td ALIGN='LEFT' bgcolor='#EBEBEB'><font size=2><a href='([^<]*)</font></a></td>@", $string, $matches);
?>
 
/*print_r($matches) :
Array
(
  [0] => Array
    (
      [0] => 
      [1] => 
    )
 
  [1] => Array
    (
      [0] => blabla'>
      [1] => toto'>
    )
 
)*/
PS: je ne crois pas que les simples guillemets soient aux normes html.
Zwiter est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h20.


 
 
 
 
Partenaires

Hébergement Web