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 :

Utiliser une classe négative avec un mot entier [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 220
    Par défaut Utiliser une classe négative avec un mot entier
    bonjour,

    je cherche une chaine qui doit se terminer par </div>, je voudrais donc écrire qqchose du genre [^(?:</div>] ... mais ca marche pas, la chaine est coupé au premier caractere trouvé, comment faire pour que ce ne soit que la chaine entière "</div>" qui termine la chaine.

    sinon j'ai aussi essayé comme ca: #class="maclasse">(.*)</div>#
    mais ca ne marche pas mieux.

    ca se voit peut etre mais je debute dans les regexp!
    merci

  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 : 52
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Bonjour,

    dans un premier temps, vous pouvez utiliser une regex non greedy

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $reg = '#class="maclasse">(.*?)</div>#';

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 220
    Par défaut
    oui merci, ca marche.

    Pour info, il faut ajouter le U a la regexp (apres le delimiteur de fin),
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $reg = '#class="maclasse">(.*?)</div>#U';
    enfin je dis pas ça pour vous, c'est surement un oubli

  4. #4
    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 : 52
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Citation Envoyé par gael Voir le message
    oui merci, ca marche.

    Pour info, il faut ajouter le U a la regexp (apres le delimiteur de fin),
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $reg = '#class="maclasse">(.*?)</div>#U';
    enfin je dis pas ça pour vous, c'est surement un oubli
    Absolument pas !

    Il faut choisir soit le U, soit le ?, mais jamais au grand jamais les deux ensembles, car la présence du U inverse le comportement de ?, ce qui va invariablement mener à des quiproquos.

    Donnez-moi votre chaîne de test si c'est possible, parce que si ça marche comme vous l'indiquez, il y a un problème. => re-

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 220
    Par défaut
    en effet, il n'y a pas le ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '#class="produit_description"[^>]*>(.*)</div>#sU'
    au fait il sert à quoi? normallement ca ne remplace pas un seul caractère, je ne comprends pas son utilité dans l'expresion (.*?)

    j'étais pourtant content d'avoir réussit à trouver une erreur d'un moderateur

  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 : 52
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Citation Envoyé par gael Voir le message
    j'étais pourtant content d'avoir réussit à trouver une erreur d'un moderateur
    LOL !

  7. #7
    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 : 52
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Attention à ne pas confondre les deux comportements du ?

    Ici cela signifie que c est facultatif

    Ici cela veut dire qu'il faut prendre plusieurs c, mais le moins possible.

  8. #8
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 220
    Par défaut
    je vois (un peu mieux) maintenant.

    Mais j'ai un nouveau problème; à partir de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <table class="command_lines">
    <tr>
      <td> 
            texte1
      </td>
    </tr>
    <tr>
      <td>
            text2
      </td>
    </tr>
    ...
    je voudrais récupérer texte1 et texte2. J'ai essayé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '/class="command_lines".*<td>(.*)</sU'
    mais ca ne me retourne que la premiere occurence, comment faire pour qu'elle soient toutes retournées?

  9. #9
    Membre éclairé
    Profil pro
    lkjlgj
    Inscrit en
    Février 2007
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : Angola

    Informations professionnelles :
    Activité : lkjlgj

    Informations forums :
    Inscription : Février 2007
    Messages : 255
    Par défaut
    Bonjour,

    Dans la même veine, j'ai un probleme avec une classe negative :

    Considerons la sequence suivante que je souhaite extraire a l'interieur d'un fichier xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    (...)
    <tr class="news_row">
    <td class="odd"><input name="basketitem" value="9878167" type="checkbox"></td>
    <td class="odd" align="left"><a class="doclink" href="http://www.toto.fr/subscriber/showitem?service=108&amp;listid=NewsList3633&amp;listpage=1&amp;docid=9878167">C'est la crise partout !" - Paulo Portas</a></td>
    <td class="odd" align="left">07/07/2009 15:33</td>
    <td class="odd" align="left">Lisboa, Portugal</td>
    </tr>
    (...)
    Je repere facilement la 1ere ligne grace a l'expression reguliere suivante :
    $pattern = '/<\s*tr\s+class\s*=\s*\"\s*news_row\s*\"\s*>/';

    Mais je voudrais tout recuperer jusqu'a la balise fermante "</tr>".

    Comment definir cette negation de chaine ?

  10. #10
    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 : 52
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Toujours pareil : greedy or not greedy, that is the question...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?php
    $str = <<<EOS
    <tr class="news_row">
    <td class="odd"><input name="basketitem" value="9878167" type="checkbox"></td>
    <td class="odd" align="left"><a class="doclink" href="http://www.toto.fr/subscriber/showitem?service=108&amp;listid=NewsList3633&amp;listpage=1&amp;docid=9878167">C'est la crise partout !" - Paulo Portas</a></td>
    <td class="odd" align="left">07/07/2009 15:33</td>
    <td class="odd" align="left">Lisboa, Portugal</td>
    </tr>
    <tr>
    </tr>
    EOS;
     
    $reg = '#<\s*tr\s+class\s*=\s*\"\s*news_row\s*\"\s*> (.*?) </tr>#sx';
    preg_match($reg, $str, $m);
    print_r($m);

  11. #11
    Membre éclairé
    Profil pro
    lkjlgj
    Inscrit en
    Février 2007
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : Angola

    Informations professionnelles :
    Activité : lkjlgj

    Informations forums :
    Inscription : Février 2007
    Messages : 255
    Par défaut
    Merci s.n.a.f.u !!

    Ca marche parfaitement comme ca.

  12. #12
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 220
    Par défaut
    en allant un peu plus loin, comment pourrait-on faire pour que le contenu de chaque td soit dans un tableau, c'est a dire ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    td_content={'<input name="basketitem" value="9878167" type="checkbox">'
                      '<a class="doclink" href="http://www.toto.fr/subscriber/showitem?service=108&amp;listid=NewsList3633&amp;listpage=1&amp;docid=9878167">C'est la crise partout !" - Paulo Portas</a>',
                      '...'
    }
    mon probleme (résolu en utilisant xpath) est que je ne parviens pas à écrire un pattern qui me prenne tous les td compris entre entre <tr class="classe_du_tr"> et </tr>
    soit seul le 1er td est extrait, soit tous les td de la page

  13. #13
    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 : 52
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Ben je me prendrais pas la tête avec une regex méga compliquée (qui existe peut-être) et je ferais ça en deux fois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <?php
    $str = <<<EOS
    <tr class="news_row">
    <td class="odd"><input name="basketitem" value="9878167" type="checkbox"></td>
    <td class="odd" align="left"><a class="doclink" href="http://www.toto.fr/subscriber/showitem?service=108&amp;listid=NewsList3633&amp;listpage=1&amp;docid=9878167">C'est la crise partout !" - Paulo Portas</a></td>
    <td class="odd" align="left">07/07/2009 15:33</td>
    <td class="odd" align="left">Lisboa, Portugal</td>
    </tr>
    <tr>
    </tr>
    EOS;
     
    $reg = '#<\s*tr\s+class\s*=\s*\"\s*news_row\s*\"\s*> (.*?) </tr>#sx';
    if ( preg_match($reg, $str, $m) ) {
        $reg = '#<td[^>]*>(.*?)</td>#';
        preg_match_all($reg, $m[1], $out);
        print_r($out);
    }

  14. #14
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 220
    Par défaut
    mais ce qui m'intéresse surtout c'est de savoir si c'est possible de le faire avec une seule regex?

  15. #15
    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 : 52
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Je ne crois pas cela impossible, mais je n'en vois pas l'intérêt.
    Ce sera sûrement incompréhensible pour le commun des mortels, donc d'une maintenance hasardeuse.
    Ou comment se tirer une balle dans le pied en programmant...

  16. #16
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 220
    Par défaut
    en fait, je voudrais faire un outil à la "wysiwyg", en gros avec une interface permettant d'extraire du contenu web, un peu comme imacros.
    j'ai donc besoin de pattern les plus génériques et compacts possibles. ils ne seraient de tte façon pas lus par des humains.

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

Discussions similaires

  1. Appeler une classe CSS avec Javascript
    Par p0Kep0K dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 13/02/2006, 14h50
  2. fermer la GUI d'une class et non le soft entier
    Par iMaTh dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 02/02/2006, 18h41
  3. Réponses: 2
    Dernier message: 06/12/2005, 09h41
  4. [Applet]utiliser une classe d'un package dans une applet
    Par jeromejanson dans le forum Applets
    Réponses: 1
    Dernier message: 30/06/2005, 08h13
  5. [EJB][JONAS] EJB utilisant une classe "externe"
    Par Gregory3000 dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 13/12/2004, 19h57

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