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 :

[Tableaux] Extraire des balises d'une chaîne de caractères


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 58
    Points : 23
    Points
    23
    Par défaut [Tableaux] Extraire des balises d'une chaîne de caractères
    Bonjour à tous, je suis à la recherche d'une fonction, permettant de lire un fichier et d'y extraire uniquement certaines valeurs, je m'explique :

    dans mon fichier, j'ai du code, du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <tr>
    <td>06-04-2004</td>
    <td style="text-align: left;"><a href="index.php?mod=id=542">Programmation E...</a></td>
    <td title="Programmation en C# Ebook Français">[...]</td>
    <td><a href="index.php?type=eBook">eBook</a></td>
    <td>2,39 Mo</td>
    Ce que je voudrais, c'est que la fonction me copier dans un autre fichier, uniquement Programmation en C# Ebook Français , c'est à dire ce qu'il y a entre la balise <td title= !

    Quelqu'un saurait t'il m'aider ?!

    Edit : je viens de m'apercevoir que quelqu'un recherchait a peu pres la meme chose, quelqu'un pourrait transferer ce post vers le forum regex ?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 424
    Points : 382
    Points
    382
    Par défaut
    Si par exemple ton fichier est dans une chaine nommé $chaine, tu peux faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $deb = strpos ($chaine,"<td title=");
    $fin = strpos ($chaine,">",$deb);
    $titre = substr ($chaine,$deb+1,$fin-$deb-1);
    Je t'ai pas mis, la lecture du fichier, j'ai supposé que tu savais faire
    Si un problème ne trouve pas de solution, c'est qu'il n'y à pas de problème

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 58
    Points : 23
    Points
    23
    Par défaut
    Avant d'essayer sur un fichier j'ai d'abord fait des tests sur une chaine de caracteres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $chaine = '<td title="Programmation en C# Ebook Français">[...]</td>';
    $deb = strpos ($chaine,'<td title="');
    $fin = strpos ($chaine,'">',$deb);
    echo substr ($chaine,$deb+1,$fin-$deb-1);
    mais ça me renvoit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    td title="Programmation en C# Ebook Français"
    or je voulais retirer td title= et les guillemets..

    sinon par rapport aux fichiers j'adapterais de cette façon:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $filename = "test.txt";
    $handle = fopen ($filename, "r");
    $chaine = fread ($handle, filesize ($filename));
    fclose ($handle);
    Cependant j'imagine que lorsque je chargerais mon fichier test.txt, ca n'affichera qu'une seule chaine, or mon fichier comporte une 20aine de <td title=" ... "> .. est ce que je peux stocker ensuite chacune des chaines sous forme de tableau ?!

  4. #4
    Membre confirmé
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    397
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 397
    Points : 518
    Points
    518
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $pattern = '`<td title=\"?([^\"]+)\"?>`';
    preg_match($pattern, $subject, $matches); 
     
    echo  $matches[1];
    Zend PHP5 Certification
    MySQL 4 Core Certification

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 514
    Points : 631
    Points
    631
    Par défaut
    Citation Envoyé par GouKen Voir le message
    sinon par rapport aux fichiers j'adapterais de cette façon:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $filename = "test.txt";
    $handle = fopen ($filename, "r");
    $chaine = fread ($handle, filesize ($filename));
    fclose ($handle);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $chaine = file_get_contents('test.txt');

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 58
    Points : 23
    Points
    23
    Par défaut
    sympa ce code, ça marche,
    j'ai essayé tout bêtement ceci mais ça ne retourne que le premier :/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $filename = "test.php";
    $handle = fopen ($filename, "r");
    $chaine = fread ($handle, filesize ($filename));
    fclose ($handle);
     
    $pattern = '`<td title=\"?([^\"]+)\"?>`';
    preg_match($pattern, $chaine, $matches); 
     
    echo $matches[1];
    echo $matches[2];

  7. #7
    Membre confirmé
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    397
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 397
    Points : 518
    Points
    518
    Par défaut
    effectivement change
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match($pattern, $chaine, $matches);
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all($pattern, $chaine, $matches);
    Zend PHP5 Certification
    MySQL 4 Core Certification

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 58
    Points : 23
    Points
    23
    Par défaut
    Cette fois ci j'obtient : avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $chaine = file_get_contents('test.php');
     
    $pattern = '`<td title=\"?([^\"]+)\"?>`';
    preg_match_all($pattern, $chaine, $matches);
     
    echo $matches[0];
    echo $matches[1];

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 514
    Points : 631
    Points
    631
    Par défaut
    Une petite mise en garde, il m'arrive souvent de travailler sur des codes qui ont été altérés ou tout simplement mal codés. Donc bien souvent, voilà ce qu'on peut lire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <td title="un morceau de code">
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <td      title  = "un morceau de code" >
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <td 
    title  
    = 
    "un morceau de code"
     >
    Dans les deux derniers cas, la pattern de Gats ne fonctionne pas.

    Cordialement,
    DaRiaN.

  10. #10
    Membre confirmé
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    397
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 397
    Points : 518
    Points
    518
    Par défaut
    oui c'est vrai


    Cette fois ci j'obtient :
    Code :

    ArrayArray
    quand tu obtiens un array avec un echo c'est parce que tu essais d'afficher un tableau et non une cellule du tableau.

    Zend PHP5 Certification
    MySQL 4 Core Certification

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 58
    Points : 23
    Points
    23
    Par défaut
    Merci, ca affiche bien tous les elements !

    est il possible de formater l'affichage autrement ?

    la j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [0] => ....
    [1] => ....
    [2] => ....

  12. #12
    Membre confirmé
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    397
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 397
    Points : 518
    Points
    518
    Par défaut
    et si tu as des cas avec des espaces mal placé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern = '`<td[[:space:]]+title[[:space:]]*=[[:space:]]*\"?([^\"]+)\"?[[:space:]]*>`';
    par contre cela ne rapporte pas les lignes coupées par un retour à la ligne.

    tu veux les insérer dans un autre fichier, sous quelle forme sera ton second fichier ?
    Zend PHP5 Certification
    MySQL 4 Core Certification

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 58
    Points : 23
    Points
    23
    Par défaut
    je vais exposer ce que je cherche a faire concrètement:

    je souhaite récuperer a partir d'un site internet des informations, j'ai ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    13-09-2005 Le C pour les nuls [...] 004 * 005 Mo
    13-09-2005 SQL pour les nuls [...] 006 * 005 Mo
    voici le code associé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <tr>
    <td>13-09-2005</td>
    <td style="text-align: left;"><a href="index.php?id=62085">Le C pour les nuls</a></td>
    <td title="Le C pour les nuls eBook Français">[...]</td>
    <td>004 * 005 Mo</td></tr>
     
    <tr>
    <td>13-09-2005</td>
    <td style="text-align: left;"><a href="index.php?id=62086">SQL pour les nuls</a></td>
    <td title="SQL pour les nuls eBook Français">[...]</td>
    <td>006 * 005 Mo</td></tr>
    on remarque donc que le titre complet est disponible grâce à la balise <td title=" ...

    ce que je souhaiterais avoir c'est une copie dans un deuxième fichier de cette forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    13-09-2005 Le C pour les nuls eBook Français 004 005
    13-09-2005 SQL pour les nuls eBook Français 006 005
    ...

  14. #14
    Membre confirmé
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    397
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 397
    Points : 518
    Points
    518
    Par défaut
    13-09-2005 Le C pour les nuls eBook Français 004 005
    13-09-2005 SQL pour les nuls eBook Français 006 005

    La date ainsi que les chiffres de fin de ligne tu as le code pour les récupérer ?

    - récupèrer les valeurs
    - insérer dans un tableau
    - lire le tableau et écrire dans le fichier



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // pour que ce soit plus lisible
    $titres = $matches[1];
    foreach ($titres  as $libelle)
    {
     //écriture dans le fichier  avec $libelle pour le titre	
     
    }
    Zend PHP5 Certification
    MySQL 4 Core Certification

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 58
    Points : 23
    Points
    23
    Par défaut
    pour la date et les chiffres non je n'ai pas le code,
    je pensais que je pourrais peut etre me base sur le fait qu'il y a - - 2 tirets ou alors définir <td>XXXX-2005</td> afficher XXXX et rajouter a la chaine -2005 ...

    sinon pour les autres chiffres, pareil comme séparateurs :
    <td>XXX* pour le premier
    *XXX</td> pour le second...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // pour que ce soit plus lisible
    $titres = $matches[1];
    foreach ($titres  as $libelle)
    {
     //écriture dans le fichier  avec $libelle pour le titre	
     
    }
    que veux tu dire par libelle pour le titre ?!

  16. #16
    Membre confirmé
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    397
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 397
    Points : 518
    Points
    518
    Par défaut
    Citation Envoyé par GouKen Voir le message
    pour la date et les chiffres non je n'ai pas le code,
    je pensais que je pourrais peut etre me base sur le fait qu'il y a - - 2 tirets ou alors définir <td>XXXX-2005</td> afficher XXXX et rajouter a la chaine -2005 ...

    sinon pour les autres chiffres, pareil comme séparateurs :
    <td>XXX* pour le premier
    *XXX</td> pour le second...



    que veux tu dire par libelle pour le titre ?!
    $titres c'est le tableau contenant tous les titres et $libelle c'est la variable qui contient la chaine de caractere pour chaque titre.

    tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $titres 
     
    Array
    (
        [0] => Programmation en C# Ebook Français
        [1] => SQL pour les nuls
        [2] => Developpez.net pour les geeks :)
        [3] => un morceau de code... ah que je ne savais plus quoi mettre!
    )
    avec le foreach, $libelle prend tour à tour chaque valeur

    C'était juste pour avoir une variable plus parlante (que $matches) ....
    Zend PHP5 Certification
    MySQL 4 Core Certification

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 58
    Points : 23
    Points
    23
    Par défaut
    niquel ca marche, ca m'affiche bien a la suite les titres

    je vais essayer d'adapter ça pour le reste des chaines que je souhaite extraire
    par contre je ne sais pas tout a fait ce que je dois mettre pour les conditions du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '`<td title=\"?([^\"]+)\"?>`'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pour les dates : <td>([^\"]+)-2005</td> ?
    j'avoue que je ne sais pas comment ça fonctionne

  18. #18
    Membre confirmé
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    397
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 397
    Points : 518
    Points
    518
    Par défaut
    je te propose ce site très bien fait concernant les expressions régulière

    http://www.expreg.com/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern = '`<td>[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{4}</td>`';
    d'une manière équivalente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern = '`<td>[0-9]{2}-[0-9]{2}-[0-9]{4}</td>`';

    je les ai faite rapido ... ça te donne une idée comme ça
    Zend PHP5 Certification
    MySQL 4 Core Certification

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 514
    Points : 631
    Points
    631
    Par défaut
    Il faut prendre l'habitude d'apprendre avant de pratiquer. Si vous êtes d'accord avec ce principe, renseignez-vous un maximum sur les regex et avec un peu de logique, vous y arriverez très bien sans l'aide de personne.

    Pour le cas "<td>13-09-2005</td>", vous y arriverez quand vous connaitrez la syntaxe des regex, mais il vous faudra de la logique.

    Que voyons nous? Une balise "<td>" une date (format jj-mm-aaaa) et une balise "</td>". Si nous décomposons un peu plus ce que nous voyons, on peut s'attarder sur la date, elle est composé de chiffres et de tirets? Mais nous savons aussi que dans ce format, nous avons 2 chiffres, un tiret, 2 chiffres encore, un tiret de plus et 4 chiffres. Vous devez en tenir compte pour la création du pattern.

    C'est un peu rébarbatif, mais c'est vraiment très puissant. Et c'est pour cela qu'il faut le maitriser.

    Edit: Ah Gats m'a devancé, désolé!

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 58
    Points : 23
    Points
    23
    Par défaut
    ouais j'ai regardé le site est bien expliqué, je pense pouvoir réussir pour la suite, par contre...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $chaine = file_get_contents('test.php');
     
    $pattern = '`<td>[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{4}</td>`';
    preg_match_all($pattern, $chaine, $date);
    $dates = $date[1];
     
     
    foreach ($dates as $libelle)
    {
     echo "$libelle<br>";
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    m'affiche une erreur : Warning: Invalid argument supplied for foreach() in /mnt/167/sda/f/c/index.php on line 27
    mais avec : print_r($date); , cela m'affiche bien le tableau !
    et pour afficher a la suite les dates puis les titres etc.. j'avais pensé a faire quelque chose de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    foreach ($dates as $ma_date)
    {
       foreach ($titres as $mon_titre)
       {
          echo "$ma_date $mon_titre<br>";
       }
    }

Discussions similaires

  1. [Tableaux] Extraire des mots d'une chaine de caractères
    Par pratiquement dans le forum Langage
    Réponses: 5
    Dernier message: 24/01/2008, 09h20
  2. [Tableaux] Extraire les chiffres dans une chaîne
    Par Digiduck dans le forum Langage
    Réponses: 8
    Dernier message: 16/08/2006, 14h33
  3. extraire des entiers d'une chaine de caractère
    Par 18Marie dans le forum Langage
    Réponses: 9
    Dernier message: 10/08/2006, 11h17
  4. [MySQL] extraire des nombre d'une chaine de caractères et addition
    Par Yotho dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 04/03/2006, 16h54
  5. Réponses: 9
    Dernier message: 17/01/2003, 11h45

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