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/04/2007, 09h33   #1
Invité de passage
 
Inscription : février 2007
Messages : 10
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 10
Points : 4
Points : 4
Par défaut Comment récupérer du texte entre balises <font> ?

Bonjour,

J'ai un problème qui me semble insoluble. J'ai un fichier texte dont le contenu est de la forme suivante.

Code HTML :
1
2
<font color='#FF0099'>Bugs_Bunny</font><br>
<font color='#0033CC'>Sylvestre</font><br> etc...

Je voudrais récupérer le texte uniquement. J'ai le code suivant pour cela.

Code :
1
2
3
4
5
6
7
8
9
10
11
$donnees=file_get_contents($fichier);
preg_match_all('`<font[^>]*>([^<]+)</font>`i',$donnees,$out);
$nombre=count($out[0]);
for($i=0; $i < $nombre; $i++){
$tableau[].=$out[0][$i];
}
$pseudo1=$tableau[0];
$pseudo2=$tableau[1]; etc...
 
echo $pseudo1; // affiche Bugs_Bunny
echo $pseudo2; // affiche Sylvestre
Un peu plus loin dans le code, je dois vérifié si les variables récupérées figurent dans un autre fichier.

Code :
1
2
3
4
5
6
if(!ereg($pseudo1,$fichier2)){
// si la variable pseudo1 n'existe pas dans fichier2, on l'efface
}
if(!ereg($pseudo2,$fichier2)){
// si la variable pseudo 2n'existe pas dans fichier2, on l'efface
} etc...
Mais ça ne fonctionne pas, a chaque fois les variables pseudos sont effacées même si elles sont présente dans $fichier2.

En rajoutant dans mon code ceci.

Code :
1
2
3
4
5
6
7
8
9
$test1="Bugs_Bunny";
$test2="Sylvestre";
 
if($test1 == $pseudo1){
echo $pseudo1; // n'affiche rien
}
if($test2 == $pseudo2){
echo $pseudo2; // n'affiche rien
}
Donc les variables test1 et pseudo1 puis test2 et pseudo2 ne sont pas égales.
Pourtant elles devraient l'être, je n'y comprend rien. Merci pour vôtre aide je ne trouve pas ou se cache l'erreur. Certainement dans preg_match_all.
leboy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2007, 15h00   #2
Membre éclairé
 
Avatar de deY!
 
Inscription : avril 2006
Messages : 403
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : avril 2006
Messages : 403
Points : 358
Points : 358
J'ai pas tout compris, mais tu peux aussi le faire en javascript...

Sinon oriente toi vers xml parser, il permet d'explorer un fichier xml avec php... ça fonctionne donc surement avec le html.

__________________
deY!
deY! est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2007, 15h48   #3
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 n'ai pas tout compris sur la suite donnée. Je pense qu'il y a quand même des erreurs sur la partie que vous nous montrez :
Code :
1
2
3
4
5
preg_match_all('`<font[^>]*>([^<]+)</font>`i',$donnees,$out);
$nombre=count($out[0]);
for($i=0; $i < $nombre; $i++){
$tableau[].=$out[0][$i];
}
La concaténation sur un tableau, vous n'avez pas d'insultes ?
Code :
$tableau[]=$out[0][$i];
L'expression régulière est gourmande, non ? Ici si vous testez avec une chaîne comme <font>1</font><font>2</font>, que récupérez-vous ?
Code :
preg_match_all('`<font[^>]*>([^<]+)</font>`Ui',$donnees,$out);
La fonction preg_match_all renvoie déjà le nombre de correspondances trouvée, inutile d'utiliser ensuite count :
Code :
$nombre = preg_match_all('`<font[^>]*>([^<]+)</font>`i',$donnees,$out);
L'indice particulier 0 du tableau des captures correspond non pas à la première capture (il faudrait utiliser l'indice 1) mais à la chaîne qui correspond enitèrement au motif (premier paramètre de la fonction preg_*). Est-ce bien ce que vous vouliez faire ?
On doit pouvoir simplifier votre boucle :
Code :
1
2
3
4
5
for($i=0; $i < $nombre; $i++){
$tableau[].=$out[0][$i];
}
$pseudo1=$tableau[0];
$pseudo2=$tableau[1]; etc...
En, à l'aide des variables dynamiques :
Code :
1
2
3
for ($i=0; $i < $nombre; $i++) {
    ${'pseudo' . ($i + 1)} = $out[1][$i];
}
Vous utilisez les fonctions ereg et PCRE (preg_*) dans votre script alors que les fonctions ereg sont vouées à une mort certaine et sont bien moins performantes et souples.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2007, 18h03   #4
Invité de passage
 
Inscription : février 2007
Messages : 10
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 10
Points : 4
Points : 4
Oui je débute il est fort probable que mon code comporte des erreurs.

En effet, on ne peut pas concaténer un tableau. Grosse erreur là-dessus. Par contre je n'ai rien compris a votre "vous n'avez pas d'insultes" ?

Code :
1
2
3
4
5
6
$nombre=count($out[0]);
for($i=0; $i < $nombre; $i++){
$tableau[].=$out[0][$i];
}
$pseudo1=$tableau[0];
$pseudo2=$tableau[1];
J'ai simplifié mon code et ai remplacé le code ci-dessus par le code suivant.

Code :
1
2
3
4
foreach($out as $val){
//récupération des variables
$pseudo1=$val[0]; //etc...
}
Enfin en ce qui concerne les POSIX comme ereg, si elles sont moins performante, je ne crois pas qu'elles seront supprimés. Imaginez la grogne de ceux qui ont des centaines de scripts utilisant des ereg. Il faudrait tout modifier. Par contre à partir de maintenant je vais préférer les PCRE.

Merci beaucoup pour vos remarques et vôtre aide, c'est résolu.
leboy 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 10h06.


 
 
 
 
Partenaires

Hébergement Web