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

JavaScript Discussion :

Regex d'une page HTML


Sujet :

JavaScript

  1. #1
    Membre du Club
    Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2007
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2007
    Messages : 146
    Points : 48
    Points
    48
    Par défaut Regex d'une page HTML
    Bonjour à tous,

    depuis ce matin je suis sur un "problème"? de regex sur du code source html ...
    Bon, déjà, le regex c'est pas si simple en JS mais bon, je suis obligé, et bien ca fait bosser un peu

    Je suis en train de creer un script GreaseMonkey qui avec le code source de la page courante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document.body.innerHTML
    je veux récupérer une multitude d'info, pour être précis 50*6.

    Voici mon code JS :

    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
    19
    20
    21
    22
    23
    24
    25
    26
     
    var ok = true;
     
    var all_user = /<input type='hidden' name='do' value='delete'>(.*?)<BR><input type='button'/g.exec(document.body.innerHTML);
    var all_user4 = document.body.innerHTML.match(/<input type='hidden' name='do' value='delete'>([\s\S]*?)<BR><input type='button'/m);
    var all_user2 = /<li class="index"><a href="index.php"><span>(.*?)<li class="forums"><a href="forums.php"><span>/g.exec(document.body.innerHTML);
    var all_user3 = /<li class="index"><a href="index.php"><span>/.exec(document.body.innerHTML);
    var string = document.body.innerHTML;
    var regex  = /<input type='hidden' name='do' value='delete'>([\s\S]*?)<\/table><BR><input type='button' value='Check All' onclick='this\.value=check\(form\)'>/g; 
    console.log( regex.exec(string) ); // Console Firebug 
     
    for (j=1; j<=50; j++){ 
    var user = /<tr>(.*?)<\/tr>/.exec(all_user);
    var var1 = /<a href=dtls.php\?id=[0-9]+>(.*?)<\/a>/.exec(user);
    var var2 = /<td class=table_col2 align=center>(.*?)<\/td>/.exec(user);
    var var3= /<td class=table_col1 align=center>(.*?)<\/td>/.exec(user);
    var var4= /<td class=table_col2 align=center>(.*?)<\/td>/.exec(user);
    var var5= /<td class=table_col1 align=center>(.*?)<\/td>/.exec(user);
    var var6 = /<td class=table_col2 align=center>(.*?)<\/td>/.exec(user);
    if (ok) {
    	alert(var1+ " " +  var2+ " " +  var3+ " " +  var4+ " " +  var5+ " " +  var6);
    	ok = false;
    	}
    //file.WriteLine(var1+ " " +  var2+ " " +  var3+ " " +  var4+ " " +  var5+ " " +  var6); //ActiveXObject ne marche pas sous FF
    }
    //}

    Mon code source qui m'interesse ici est de cette tête :

    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
    19
    20
    21
    <form action='test.php?ok=users' method='POST'><input type='hidden' name='do' value='delete'>
    		<tr><td class=table_col1 align=center><a href=dtls.php?id=128895>VAR1</a></td>
    		<td class=table_col2 align=center>VAR2</td>
    		<td class=table_col1 align=center>VAR3</td>
     
    		<td class=table_col2 align=center>VAR4</td>
    		<td class=table_col1 align=center>VAR5</td>
    		<td class=table_col2 align=center>VAR6</td>
    		<td class=table_col1 align=center><input type=checkbox name='userids[]' value='128895'></td>
    		</tr>
     
    <tr><td class=table_col1 align=center><a href=dtls.php?id=12895>VAR1</a></td>
    		<td class=table_col2 align=center>VAR2</td>
    		<td class=table_col1 align=center>VAR3</td>
     
    		<td class=table_col2 align=center>VAR4</td>
    		<td class=table_col1 align=center>VAR5</td>
    		<td class=table_col2 align=center>VAR6</td>
    		<td class=table_col1 align=center><input type=checkbox name='userids[]' value='12895'></td>
    		</tr>
    ETC
    bref, voilà, je veux récup les VARx

    Alors j'ai commencé à écrire un truc. Il y a une partie dont je ne suis pas sur, c'est ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var var1 = /<a href=dtls.php\?id=[0-9]+>(.*?)<\/a>/.exec(user);
    var var2 = /<td class=table_col2 align=center>(.*?)<\/td>/.exec(user);
    var var3 = /<td class=table_col1 align=center>(.*?)<\/td>/.exec(user);
    var var4 = /<td class=table_col2 align=center>(.*?)<\/td>/.exec(user);
    var var5 = /<td class=table_col1 align=center>(.*?)<\/td>/.exec(user);
    var var6  = /<td class=table_col2 align=center>(.*?)<\/td>/.exec(user);
    Je ne sais pas si ca capture bien ce que je veux puisque "<td class=table_col2 align=center>" n'est pas unique ...

    Mais c'est pas ici que je coince pour le moment, mais ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var string = document.body.innerHTML;
    var regex  = /<input type='hidden' name='do' value='delete'>([\s\S]*?)<\/table><BR><input type='button' value='Check All' onclick='this\.value=check\(form\)'>/g; 
    console.log( regex.exec(string) ); // Console Firebug
    Il me renvoie NULL.


    Une idée ? (ca doit pas être très compliqué, mais j'ai absuloment rien trouvé sur le net)

    PS : y a des testes dans mon js : all_usersX

  2. #2
    Membre actif Avatar de nod__
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 176
    Points : 226
    Points
    226
    Par défaut
    C'est a peu près une très mauvaise idée d'utiliser une regex pour chercher des infos dans une page HTML.

    Utilise le DOM avec document.getElementsByTagName("td");

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    /**
     * @param table element DOM optionnel pour réduire la recherche à un seul element
     */
    function recupVAR (table) {
      table = table || document;
      var tds = table.getElementsByTagName("td"),
          tmp, i, il = tds.length,
          out = [];
     
     
      for (i =0; i < il; i++) {
        tmp = tds[i];
        // vu que c'est greasemonkey y'a moyen de virer tmp.innerText, c'est pour IE
        tmp = (tmp.textContent || tmp.innerText).replace(/^\s+|\s+$/g, ""); //trim()
        if (tmp) { // si c'est pas vide, virer les input quoi
          out.push(tmp);
        }
      /*
        La version FF only ça donne 
        tmp = tds[i].textContent.replace(/^\s+|\s+$/g, "");
        if (tmp) {
          out.push(tmp);
        }
      */
      }
      alert(out);
      return out;
    }
    C'est 100% pas tester mais ça devrait marcher.

  3. #3
    Membre du Club
    Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2007
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2007
    Messages : 146
    Points : 48
    Points
    48
    Par défaut
    Déjà merci pour une réponse si rapide, j'ai pas encore testé, et j'arrive pas bien a tout comprendre.

    A quoi correspond le table en paramètre ?

    A la table qui contient mes td ? Si oui, comment dire quel table c'est ? car j'en ai vraiment pas qu'un dans mon code source ...

    Et la fonction retourne juste 6 variables je suppose, donc il faut faire 1 boucle, 50 fois car y a 50 TR dans ma table.

    C'est bien ca ?

  4. #4
    Membre actif Avatar de nod__
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 176
    Points : 226
    Points
    226
    Par défaut
    Si ta table a un id ou une classe ça aiderais.

    Là le code prends tous les td de la page idépendemment du tableau dans lequel il se trouve donc t'as pas besoin de mettre ça dans une autre boucle. C'est l'utilité du paramètre. Si le tableau contenant tes cases a un id "scores" alors tu appelles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var tableau = document.getElementByID("score");
    recupVAR(tableau);
    Test le code et tu verras comment il fonctionne

  5. #5
    Membre du Club
    Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2007
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2007
    Messages : 146
    Points : 48
    Points
    48
    Par défaut
    Oula, je pensais avoir compris mais la je sais plus ...

    le code prends tout les TD de la page ? ou tous les TD du tableau que je donne en paramètre ?

    Oui il a une class : "table_table"

    Sinon j'ai reussi a trouvé le xpath avec firebug : /html/body/table/tbody/tr[2]/td/table[2]/tbody/tr/td[2]/table[2]/tbody/tr/td/table/tbody/tr/td[2]/table[3]/tbody/tr/td/table[2]/tbody/tr/td[2]/center[2]/table/


    EDIT : j'ai un message d'erreur :
    Erreur*: table.getElementsByTagName is not a function
    Fichier Source*: file:///C:/Documents%20and%20Settings/Flo/Application%20Data/Mozilla/Firefox/Profiles/k0n19797.default/gm_scripts/user-ut/user-ut.user.js
    Ligne*: 15

    EDIT2 : 1er erreur résolu mais j'en ai une autre :

    Erreur*: tmp.innerText is undefined
    Fichier Source*: file:///C:/Documents%20and%20Settings/Flo/Application%20Data/Mozilla/Firefox/Profiles/k0n19797.default/gm_scripts/user-ut/user-ut.user.js
    Ligne*: 23

  6. #6
    Membre du Club
    Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2007
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2007
    Messages : 146
    Points : 48
    Points
    48
    Par défaut
    (désolé pour le double post)
    Bon j'ai reussi a résoudre le problème, j'ai juste enlever le commentaire de FF only et je l'ai mis sur l'autre et maintenant ca marche

    Merci bien

    J'ai vu l'"alert" c'est assez horrible, on dirais du CVS.

    je suppose que c'est un tableau le out, donc j'ai plus qu'à faire une boucle pour récupérer les variables avec un modulo 6 pour passer au TR suivant.

    Juste pour savoir, savez vous comment je peu stocker ca dans un fichier (à la fin) car le ActiveXObject ne marche pas sous FF :S

Discussions similaires

  1. RegEx : Extraire une partie d'une page HTML
    Par tittoto dans le forum Général Python
    Réponses: 9
    Dernier message: 19/04/2010, 09h28
  2. RegEx pour extraire les liens d'une page html
    Par herch dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 13/05/2009, 17h26
  3. Inserer une page HTML comme une boite!
    Par thief dans le forum MFC
    Réponses: 4
    Dernier message: 16/01/2004, 21h13
  4. [VB.Net] Comment generer une page html dynamiquement ?
    Par Anonymous dans le forum ASP.NET
    Réponses: 3
    Dernier message: 13/03/2003, 10h22
  5. [CR] Tranfert de formulaire a travers une page HTMl
    Par LIEU dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 12/09/2002, 08h37

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