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 :

Comment récupérer du texte entre balises <font> ? [RegEx]


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 10
    Points : 9
    Points
    9
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre averti Avatar de deY!
    Inscrit en
    Avril 2006
    Messages
    403
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2006
    Messages : 403
    Points : 414
    Points
    414
    Par défaut
    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.


  3. #3
    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 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

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

Discussions similaires

  1. vb.net comment récupérer du texte entre deux "\'"
    Par infodes dans le forum VB.NET
    Réponses: 3
    Dernier message: 29/10/2014, 12h11
  2. [RegEx] Comment récupérer le texte entre deux motifs ?
    Par whitespirit dans le forum Langage
    Réponses: 6
    Dernier message: 25/03/2010, 21h59
  3. Réponses: 2
    Dernier message: 25/06/2008, 23h19
  4. Réponses: 1
    Dernier message: 26/05/2007, 17h23
  5. [C# 1.1] Comment récupérer du texte entre des mots connus ?
    Par foolsky dans le forum Windows Mobile
    Réponses: 8
    Dernier message: 26/04/2006, 14h15

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