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 :

[Système] Analyser une page HTML de favoris


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 28
    Points : 24
    Points
    24
    Par défaut [Système] Analyser une page HTML de favoris
    Bonjour à tous!

    Je cherche a créer un parser pour récupérer une liste de favoris exportée depuis un navigateur, mais j'ai un peu de mal avec les regexp

    Voici le code de la page HTMl
    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
     
    <!DOCTYPE NETSCAPE-Bookmark-file-1>
    <!-- This is an automatically generated file.
    It will be read and overwritten.
    Do Not Edit! -->
    <TITLE>Bookmarks</TITLE>
    <H1>Bookmarks</H1>
    <DL><p>
        <DT><H3 FOLDED ADD_DATE="1202562528">Blogs</H3>
        <DL><p>
            <DT><A HREF="http://www.fredcavazza.net/" ADD_DATE="1202562610" LAST_VISIT="1202562610" LAST_MODIFIED="1202562610">FredCavazza.net</A>
            <DT><A HREF="http://fredericdevillamil.com/developpement/" ADD_DATE="1202562974" LAST_VISIT="1202562974" LAST_MODIFIED="1202562974">http--fredericdevillamil.com-developpement-</A>
            <DT><A HREF="http://www.insideria.com/" ADD_DATE="1202562698" LAST_VISIT="1202562698" LAST_MODIFIED="1202562698">InsideRIA</A>
        </DL><p>
        <DT><H3 FOLDED ADD_DATE="1202562984">Digg-like</H3>
        <DL><p>
            <DT><A HREF="http://www.digg.com/" ADD_DATE="1202563342" LAST_VISIT="1202563342" LAST_MODIFIED="1202563342">Digg - All News, Videos, & Images</A>
            <DT><A HREF="http://www.scoopeo.com/" ADD_DATE="1202563068" LAST_VISIT="1202563068" LAST_MODIFIED="1202563068">Scoopeo - La une</A>
        </DL><p>
        <DT><A HREF="http://www.google.fr/" ADD_DATE="1202562516" LAST_VISIT="1202562516" LAST_MODIFIED="1202562516">Google</A>
    </DL><p>
    et voici le début de mon parser :

    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
    30
     
    <?php
     
    //Classe qui va permettre d'importer/exporter les favoris
    class BookmarkManager {
     
    	//Constructeur
    	function BookmarkManager(){
     
    	}
     
    	//Pour importer les favoris
    	function import($listURL){
    		$filehandle=fopen($listURL,'r');
    		$texte = "";
    		while(!feof($filehandle)) {
    			$texte.=fgets($filehandle, 500); // Max 500 chars
    		}
    		echo $texte;
    		preg_match_all("|<DL>([><.]*)<DT>([><.]*)</DL>|i",$texte,$resultat);
    		echo "<br>";
    		print_r($resultat);
    	}
     
     
    }
     
    $bm = new BookmarkManager();
    $bm->import("../bookmarks_IE.htm");
    ?>
    Quelle est l'expression regulieres que je dois utiliser dans le preg_match_all pour récupérer le contenu de toutes mes balises DL et DT ??

    Merci de votre aide!

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 743
    Points
    11 743
    Par défaut
    Je ne connais pas le système... quelle est la signification de DL et DT ? C'est normal s'il n'y a pas de balise fermante ?

    Pourquoi ne pas travailler sur les <A> et leurs attributs ? a priori, ça me semble plus simple.

    Dernière question, pour toi, que veut dire [><.] ?
    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 28
    Points : 24
    Points
    24
    Par défaut
    Salut,

    en HTML, DL et DT permette de définir des listes de définition.

    les balises ne sont pas fermées car le code généré par IE, FF... n'est pa valide

    Quant à [><.] et d'après mes petites connaissances en RegExp ca défini une liste de caractères autorisés, à savoir les "<" et ">" et tous type de caractères alphanum (le ".").

    Je continues mes recherches...

    a+

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 743
    Points
    11 743
    Par défaut
    Citation Envoyé par memel182 Voir le message
    Quant à [><.] et d'après mes petites connaissances en RegExp ca défini une liste de caractères autorisés, à savoir les "<" et ">" et tous type de caractères alphanum (le ".").
    Le . est en fait un joker pour TOUS les caractères, alphanumériques ou non (retour à la ligne inclus avec le modificateur s utilisé ci-dessous). Autrement dit, [><.] signifie "un >, un < ou n'importe quoi d'autre"... et comme tu peux l'imaginer, ça n'est pas très spécifique.

    En gros, voici comment récupérer le contenu des DT (je ne vois pas bien l'intérêt pour les DL ?) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all("|<DT>(.*?)(?=</?D[LT]>)|is", $texte, $resultat);
    .*? : tout les caractères
    (?= xxx) : suivi par xxx
    (?=</?D[LT]>) : suivi par <DT>, </DT>, <DL> ou </DL>
    is : insensible à la casse, et considérer tout le texte comme une seule ligne
    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 28
    Points : 24
    Points
    24
    Par défaut
    Merci beaucoup, ce code m'avance beaucoup.

    Reste un petit détail :
    Je souhaite en fait pouvoir conserver la structure exacte des favoris (par catégories ou non-catégorisés) or voici le code renvoyé par ton expression :
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    <br>Array
    (
        [0] => Array
            (
                [0] => <DT><H3 FOLDED ADD_DATE="1202562528">Blogs</H3>
     
                [1] => <DT><A HREF="http://www.fredcavazza.net/" ADD_DATE="1202562610" LAST_VISIT="1202562610" LAST_MODIFIED="1202562610">FredCavazza.net</A>
     
                [2] => <DT><A HREF="http://fredericdevillamil.com/developpement/" ADD_DATE="1202562974" LAST_VISIT="1202562974" LAST_MODIFIED="1202562974">http--fredericdevillamil.com-developpement-</A>
     
                [3] => <DT><A HREF="http://www.insideria.com/" ADD_DATE="1202562698" LAST_VISIT="1202562698" LAST_MODIFIED="1202562698">InsideRIA</A>
     
                [4] => <DT><H3 FOLDED ADD_DATE="1202562984">Digg-like</H3>
     
     
                [5] => <DT><A HREF="http://www.digg.com/" ADD_DATE="1202563342" LAST_VISIT="1202563342" LAST_MODIFIED="1202563342">Digg - All News, Videos, & Images</A>
     
                [6] => <DT><A HREF="http://www.scoopeo.com/" ADD_DATE="1202563068" LAST_VISIT="1202563068" LAST_MODIFIED="1202563068">Scoopeo - La une</A>
     
                [7] => <DT><A HREF="http://www.google.fr/" ADD_DATE="1202562516" LAST_VISIT="1202562516" LAST_MODIFIED="1202562516">Google</A>
     
            )
     
        [1] => Array
            (
                [0] => <H3 FOLDED ADD_DATE="1202562528">Blogs</H3>
     
     
                [1] => <A HREF="http://www.fredcavazza.net/" ADD_DATE="1202562610" LAST_VISIT="1202562610" LAST_MODIFIED="1202562610">FredCavazza.net</A>
     
                [2] => <A HREF="http://fredericdevillamil.com/developpement/" ADD_DATE="1202562974" LAST_VISIT="1202562974" LAST_MODIFIED="1202562974">http--fredericdevillamil.com-developpement-</A>
     
                [3] => <A HREF="http://www.insideria.com/" ADD_DATE="1202562698" LAST_VISIT="1202562698" LAST_MODIFIED="1202562698">InsideRIA</A>
     
                [4] => <H3 FOLDED ADD_DATE="1202562984">Digg-like</H3>
     
                [5] => <A HREF="http://www.digg.com/" ADD_DATE="1202563342" LAST_VISIT="1202563342" LAST_MODIFIED="1202563342">Digg - All News, Videos, & Images</A>
     
     
                [6] => <A HREF="http://www.scoopeo.com/" ADD_DATE="1202563068" LAST_VISIT="1202563068" LAST_MODIFIED="1202563068">Scoopeo - La une</A>
     
                [7] => <A HREF="http://www.google.fr/" ADD_DATE="1202562516" LAST_VISIT="1202562516" LAST_MODIFIED="1202562516">Google</A>
     
            )
     
    )
    C'est très bien sauf que par exemple, mon dernier lien vers Google ne fait initialement partie d'aucune catégorie (cf. premier post). Or ici je ne peux pas le savoir, il est retourné en DT ou en A comme les autres. D'où l'intéret, je pense, de suivre la structure des DL : les premiers sont à ommettre puisqu'ils initialisent toute la liste, par contre les autres indiquent les debut/fin des listes de chaque catégorie...

    Je vais tenter de modifier un peu ta RegExp mais je ne suis pas sûr d'arriver au bon résultat...

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 743
    Points
    11 743
    Par défaut
    dans ce cas, il te faut une première regex, qui récupère intégralement le contenu de la <dl></dl> et identifie la catégorie. Tu passes ensuite ce que tu as récupéré à ma regex.
    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 28
    Points : 24
    Points
    24
    Par défaut :resolu:
    Ouf ca y est!

    J'ai réussi à récupérer tous les titres de catégories, et pour chacune, le HREF des liens et leur intitulé!!

    J'ai par contre ignoré tous les liens qui ne sont pas catégorisés, car de toute facon je ne pourrai pas les utiliser par la suite...

    Alors voici ma solution :
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    <?php
     
    //Classe qui va permettre d'importer/exporter les favoris
    class BookmarkManager {
     
    	//Constructeur
    	function BookmarkManager(){
    	}
     
    	//Pour importer les favoris
    	function import($listURL){
    		$filehandle=fopen($listURL,'r');
    		$texte = "";
    		//on recup le texte de la page html
    		while(!feof($filehandle)) {
    			$texte.=fgets($filehandle, 500); // Max 500 chars
    		}
     
    		//on recup ttes les catégories ($categories)
    		preg_match_all("|<DT><H3(.*?)(?=</DL><p>)|is", $texte, $categories);
     
    		//pour chaque catégorie
    		for($i=0; $i<count($categories[1]); $i++){
     
    			//on extrait le titre
    			preg_match("|>(.*?)(?=</H3>)|is", $categories[1][$i], $titre);
    			echo "<b>CATEGORIE</b> : ".$titre[1]."<br>";
     
    			//on extrait les liens
    			preg_match_all("|<A(.*?)(?=</A>)|is", $categories[1][$i], $liens);
     
    			//pour chaque lien...
    			for($j=0; $j<count($liens[0]); $j++){
    				echo "$j)<br>";
    				//on recup la cible (href)
    				preg_match("|\"(.*?)\"|is", $liens[0][$j], $href);
    				echo "<b>href</b> : ".$href[1]."<br>";
     
    				//on recup le titre
    				$intitule = explode(">",$liens[0][$j]);
    				echo "<b>intitule</b> : ".$intitule[1]."<br>";
    			}
    			echo "<br><br>";
    		}
    	}
    }
    $bm = new BookmarkManager();
    $bm->import("../bookmarks_IE.htm");
     
    ?>
    C'est peut etre un peu barbare par endroits mais ca me suffira

    Merci beaucoup de ton aide, je n'aurai jamais réussi à résoudre ces RegExp...

    A bientot!

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/10/2008, 16h27
  2. [RegEx] Ennui avec l'analyse d'une page HTML
    Par Joelindien dans le forum Langage
    Réponses: 2
    Dernier message: 04/10/2007, 14h31
  3. [VB.Net] Comment generer une page html dynamiquement ?
    Par Anonymous dans le forum ASP.NET
    Réponses: 3
    Dernier message: 13/03/2003, 10h22
  4. [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