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 :

récupérer infos à partir d'un code source web [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2006
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 34
    Points : 23
    Points
    23
    Par défaut récupérer infos à partir d'un code source web
    bonjour
    j'ai quelques petits soucis, et après quelques bonnes heures de recherches, j'abandonne ...

    alors voilà

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $data = CODE SOURCE D UNE PAGE WEB;
    $expr = '#<td><a href="(.*?)">(.*?)</a></td>">#';
    //$expr = '#<td><a href="(.*?)">(.*?)</a></td><td class="(.*?)">#';
    preg_match_all($expr,$data, $res);
     
    if( count($res[0]) !=0 ){
    		echo '<h2>resultat trouves '.count($res[0]).'</h2>';
    		echo '<h1>'.strip_tags($res[2][0]).'</h1>'; //exemple d'affichage
    }else echo '<h1>no result</h1>';
    donc $expr marche parfaitement bien, et j'arrive à afficher tout ce que je souhaite,et le résultat trouvé me convient (=c'est bien ce que je cherchais à avoir )
    mais $expr (celle qui est commentée), ne me trouve plus aucun résultat ce qui n'est pas normal. Voici un bout du code source de la page récupérée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <td><a href="http://www.SITEXEB/index.php">NOM SITE WEB</a></td>  <td class="green">Not listed</td>
    donc j'ai besoin de l'URL (href), du NOM SITE et également de GREEN
    voyez vous une erreur dans ce que j'ai fait ?
    peut-être des problèmes d'espace dans l'expression régulière, mais je pense avoir déjà tout essayé ...

    en espérant vous avoir fournit assez d'éléments pour me répondre

    merci bien pour votre aide

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 144
    Points : 161
    Points
    161
    Par défaut
    Utilise plutôt un outil fait pour parser du HTML proprement :
    http://simplehtmldom.sourceforge.net/

    Et indique-nous ce que tu souhaites récupérer et dans quoi.

  3. #3
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Bonjour,



    La RE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $expr = '#<td><a href="(.*?)">(.*?)</a></td>">#';
    ne marche pas, il y a dans sa fin les deux caractères qui terminent l’autre RE commentarisée: or il n’y a pas ces deux caractères après ’</a></td>’ dans la chaîne, mais deux blancs.

    Ce qui matche c’est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $expr   = '#<td><a href="(.*?)">(.*?)</a></td>#';


    Et pour l’autre, il faut insérer deux blancs au milieu après </a></td>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $expr   = '#<<td><a href="(.*?)">(.*?)</a></td>  <td class="(.*?)">#'




    Ceci dit, pour attraper des portions qui sont entre “ “ et sont donc dénuées du caractère , il faut faire une répétition du symbole signifiant tout sauf " et l’entourer de parenthèses, aux deux endroits de l’adresse et de green:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $expr   = '#<td><a href="([^"]+)">(.*?)</a></td>  <td class="([^"]+)">#'


    Nota bene: je doute qu’il y ait vraiment deux blancs après
    ’</a></td>’ dans le code source réel.

  4. #4
    Membre à l'essai
    Inscrit en
    Décembre 2006
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 34
    Points : 23
    Points
    23
    Par défaut
    Bonjour,
    merci pour toutes ces réponses
    merci pour l'outil, c'est toujours intéressant à en connaître l'existence,
    je m'en serais sans doute servit si j'avais plus qu'une seule expression régulière à faire

    pour en revenir à mon problème, ça ne marche toujours pas
    donc revoici un bout de code source de la page :
    (j'ignore pourquoi lorsque je fais un copier/coller, il y a un espace qui s'est rajouté entre le </td> & <td>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <td><a href="http://www.SITEWEB/index.php">BLABLABLA</a></td> <td class="green">Not listed</td>
    donc avec ma 1ère expression régulière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $expr = '#<td><a href="(.*?)">(.*?)</a></td>
    je parviens bien à récupérer
    http://www.SITEWEB/index.php ET BLABLABLA

    mais j'ai également besoin de récupérer SOIT green SOIT Not listed
    et donc en essayant les 2 RE suivantes, aucune ne donnent un résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $expr   = '#<td><a href="([^"]+)">(.*?)</a></td> <td class="([^"]+)">#'
    $expr   = '#<<td><a href="(.*?)">(.*?)</a></td>  <td class="(.*?)">#'
    ça ne rentre pas dans mon IF, mais ça va dans le ELSE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    preg_match_all($expr,$data, $res);
    if( count($res[0])!=0 ){ echo 'OK' }
    else echo 'KO'

    merci pour votre aide

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2006
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 34
    Points : 23
    Points
    23
    Par défaut
    edit:
    je viens de remarquer quelque chose "d'étrange"

    ceci marche parfaitement bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $expr = '#<td class="(.*?)">#';

    mais cela, ne marche plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $expr = '#</td><td class="(.*?)">#';
    sachant que j'ai essayé avec 1, 2 ... 3 espaces
    j'ai même tenté &nbsp; mais toujours rien ...


    ==================================================
    edit :

    j'ai trouvé la solution, il suffit de mettre \s*
    ce qui donne donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $expr = '#<td><a href="(.*?)">(.*?)</a></td>\s*<td class="(.*?)">#';
    merci bien à tous

  6. #6
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    L’une des RE que j’ai écrite dans le message #3 est fausse:
    la 3ième RE a deux caractères < successifs en tête.
    Désolé pour cette étourderie.

    Sans cette faute, cette 3ième RE marche bien avec le bout de code source que tu avais donné dans le message #1, c’est à dire qui comportait deux blancs entre </a></td> et <td class, parce que cette RE comporte 2 blancs.

    La 4ième RE, celle avec les crochets, dans ce message #3 marche aussi avec le bout de code source donné dans le message #1, c’est à dire qui comportait deux blancs entre </a></td> et <td class, parce qu’elle comporte elle aussi 2 blancs.

    Ces deux RE étaient adaptées au code source que tu avais donné.



    --------------------------------------------



    Dans le message #8 tu présentes deux RE en disant qu’elles ne matchent pas.

    Mais ça n’a rien d’étonnant, parce que tu confirmes qu’il n’y a effectivement pas deux blancs entre '</a></td>' et '<td class' dans le code source. Comme je le pensais.

    Or sur les deux RE qui ne marchent pas, la deuxième est encore avec ses deux blancs et la faute que j’ai commise dans le message #3,
    et la première n’a qu’un blanc, mais comme elle a des crochets je parie que c’est ma 4ième du message #3 et que tu l’a recopiée dans le message #8 en faisant toi même une faute.

    Tu me suis ?



    Pour résumer, je pense que quand tu écris que les 2 RE ne marchent pas, tu as en réalité essayé les deux RE avec deux blancs
    sur un code source avec un seul blanc.
    C’est sûr que ça ne peut pas marcher.


    --------------------------------------------------------


    Donc je maintiens : à condition évidemment de ne mettre qu’un seul blanc dans la RE s’il n’y a qu’un seul blanc dans le code source entre '</a></td>' et '<td class', eh bien la RE suivante marche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '#<td><a href="([^"]+)">(.*?)</a></td> <td class="([^"]+)">#'
    sur le code source suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '#<td><a href="http://www.SITEWEB/index.php">BLABLABLA</a></td> <td class="green">Not listed</td>#'





    Une chose est vraisemblable:
    tu présentes un code source avec un seul blanc entre </a></td> et <td class,
    mais dans le code source complet il existe peut être des cas où il n’y a pas de blanc. Dans ces conditions il faut spécifier dans la RE que le blanc est facultatif entre </a></td> et <td class.
    Tant qu’on y est, au lieu de mettre un ? , on met une étoile qui englobe n’importe quel nombre de blancs, de zéro à l’infini.
    Ce qui donne la RE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '#<td><a href="([^"]+)">(.*?)</a></td> *<td class="([^"]+)">#'



    Il se peut aussi qu’entre une partie '<td><a href="http://www.SITEWEB/index.php">BLABLABLA</a></td>’
    dans le code source
    et la partie '<td class="green">Not listed</td>'
    il y ait parfois des retours à la ligne.
    Auquel cas, il faut effectivement mettre \s au lieu d’un blanc dans la RE.





    Par ailleurs, comme tu parles maintenant de vouloir attraper aussi “Not listed“, il faut compléter la RE en conséquence. Il faut:ajouter (.+?)</td> et on aboutit à la RE suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '#<td><a href="([^"]+)">(.*?)</a></td>\s*<td class="([^"]+)">(.+?)</td>#'




    Tu fais comme tu veux, mais de mon point de vue il ne fait pas de doute qu’il est mieux de mettre des crochets. Sinon tu perds en fiabilité de la regex, et à ce moment là, ça ne m’intéresse pas de faire du bricolage.

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

Discussions similaires

  1. [WD12] Info manquante dans le code source d'une page web
    Par zouzoukha dans le forum WinDev
    Réponses: 12
    Dernier message: 18/06/2012, 04h21
  2. Réponses: 0
    Dernier message: 29/11/2011, 09h20
  3. Réponses: 5
    Dernier message: 06/04/2008, 20h08
  4. Réponses: 5
    Dernier message: 13/04/2007, 13h54

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