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 :

Extraire tableau HTML d'une chaine [RegEx]


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 11
    Points : 8
    Points
    8
    Par défaut Extraire tableau HTML d'une chaine
    Bonsoir,

    Je cherche à extraire les tableaux dans le texte suivant :

    Bonjour, ce qui suis est un tableau html <table><tr><td>blabla>bla</td></tr></table> et en voici un autre <table><tr><td>blibliblibli</td></tr><tr><td>blibliblibli</td></tr></table>. Qu'en dites-vous ?
    Ce qui devrait me donner :

    "<table><tr><td>blabla>bla</td></tr></table>" et
    "<table><tr><td>blibliblibli</td></tr><tr><td>blibliblibli</td></tr></table>"

    J'utilise quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $reg = '#<table(.*)</table>#';
    $texte = preg_replace_callback($reg, 'parseTableaux', $texte);
    Sauf que là, j'obtiens un seul résultat :
    "<table><tr><td>blabla>bla</td></tr></table> et en voici un autre <table><tr><td>blibliblibli</td></tr><tr><td>blibliblibli</td></tr></table>"

    Il n'en voit qu'un seul, en fait.

    Il me faudrait donc exclure la présence de la chaine "<table", comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $reg = '#<table([^<table])</table>#';
    $texte = preg_replace_callback($reg, 'parseTableaux', $texte);
    Sauf que c'est interdit, la partie en gras. Je peux exclure un caractère, mais pas une chaîne...

    Quelle est la solution ?

    J'ai cherché du côté des assertions, mais elles ne me semblent pas être la solution, je me trompe ?

    Merci pour votre aide, j'ai passé une bonne partie de mon week-end dessus, j'y vois tout trouble, j'en finis par me demander si c'est possible ?

  2. #2
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Salut,

    C'est beaucoup plus simple : c'est le caractère greedy de l'expression .* qui te met dedans.

    De cette façon, ça ira mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    // motif
    $myPattern = '#<table>(.*?)</table>#';
     
    // tests
    $myString = "Bonjour, ce qui suis est un tableau html <table><tr><td>blabla>bla</td></tr></table> et en voici un autre <table><tr><td>blibliblibli</td></tr><tr><td>blibliblibli</td></tr></table>. Qu'en dites-vous ?";
    print preg_replace($myPattern, 'tablo', $myString);

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Merci jml94, cela fonctionne, effectivement.

    Je vous envie pour votre maîtrise des expressions régulières !

    Par contre, je ne comprends pas pourquoi (.*?) n'intègre pas également les balises <table> et donc comment cela dissocie bien les 2 tableaux

  4. #4
    Modérateur
    Avatar de blueice
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2003
    Messages
    3 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 487
    Points : 5 134
    Points
    5 134
    Par défaut
    Euh... c'est pas plutôt un preg_match_all ????
    S'il cherche à extraire tous les tableaux...

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    En fait, je veux travailler sur les tableaux, les analyser, et les remplacer dans la chaine originale.

    Je veux donc pouvoir extraire chaque tableau pour travailler sur une chaine comme :

    "<table>contenu du tableau, nombre de ligne et de cellule variable</table>"

    Ensuite, travaillant sur cette chaine, je construis quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    | cellule 1 | cellule 2 | cellule 3 |
    | cellule 4 | cellule 5 | cellule 6 |
    Que j'insère dans la chaine originale à la place de "<table>...</table>".

    Voilà ce qui est exactement mon besoin. Mais seul la regexp me posait problème.

    Et comme je procède à du remplacement de chaine, j'utilisais preg_replace_callback. Cela devrait fonctionner, non ?

  6. #6
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par Domi69 Voir le message
    Merci jml94, cela fonctionne, effectivement.

    Je vous envie pour votre maîtrise des expressions régulières !

    Par contre, je ne comprends pas pourquoi (.*?) n'intègre pas également les balises <table> et donc comment cela dissocie bien les 2 tableaux
    Par défaut avec le moteur PCRE, le quantificateur * est greedy (gourmand en français). Il cherche à attraper la plus grande chaîne possible.

    Ainsi l'expression <table>(.*)</table> est reconnu en attrapant le premier <table> et le dernier </table>.

    En ajoutant ?, nous lui recommandons de ne pas avoir les yeux plus grands que le ventre et de n'attraper que la plus petite chaîne possible. Et c'est pourquoi nous obtenons le bon résultat.

    A noter que le comportement que tu souhaitait au départ est possible : dire tous les caractères qui ne sont pas </table> grâce aux assertions, mais cela est encore un peu plus poussé.

    Ca pourrait donner ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <?php
    // motif
    $myPattern = '#<table>((?!</table>).)*+</table>#';
     
    // tests
    $myString = "Bonjour, ce qui suis est un tableau html <table><tr><td>blabla>bla</td></tr></table> et en voici un autre <table><tr><td>blibliblibli</td></tr><tr><td>blibliblibli</td></tr></table>. Qu'en dites-vous ?";
    print preg_replace($myPattern, 'tablo', $myString);
    Pour plus d'infos, voir cet excellent article : http://g-rossolini.developpez.com/tu...e=page_2#LII-8

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Merci pour ton explication !

    C'est maintenant clair et limpide. Et je vais pouvoir simplifier de nombreux patterns.

    Encore merci !

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

Discussions similaires

  1. Comment extraire des caractères d'une chaine ?
    Par Powa87 dans le forum Langage
    Réponses: 16
    Dernier message: 01/01/2005, 19h00
  2. Extraire un nom d'une chaine de caractere
    Par iamspacy dans le forum Linux
    Réponses: 4
    Dernier message: 03/05/2004, 21h34
  3. extraire le caratere d'une chaine
    Par keny dans le forum MFC
    Réponses: 2
    Dernier message: 06/02/2004, 16h30
  4. [LG]Extraire des nombres d'une chaine
    Par audreym31 dans le forum Langage
    Réponses: 4
    Dernier message: 18/01/2004, 21h24
  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