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 :

Problème pour nettoyer [preg_replace] [RegEx]


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 6
    Points : 7
    Points
    7
    Par défaut Problème pour nettoyer [preg_replace]
    Bonjour!

    J'ai modifié un crawler pour extraire des informations à partir d'un fichier html, mais je coince au niveau de la fonction preg_replace quand je veux nettoyer et organiser mes informations.


    Je m'explique :

    //une des balises à extraire du fichier html
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <div class="illus">
    	<a href="/boissons-sans-alcool/jus-de-fruits/pd/jus-de-fruit-de-la-marque-dupont-2l">
    	<img height="100" width="100" alt="jus-de-fruit-de-la-marque-dupont-2l" src="/imgs/produits/3123340444550.jpg" />
            </a><!--3123340444550.jpg-->
    </div>

    //extraction des balises et du contenu (içi la balise <div class="illus"></div>)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all('<div class="illus">(.*)</div>Us', $html_brut, $contenu_extrait);
    //placement des signes %% pour nettoyer le contenu placé entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all('%<div class="illus">(.*)</div>%Us', $html_brut, $contenu_extrait);
    //nettoyage du contenu avec preg_replace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $element = preg_replace('%<div class="illus">%', '', $element);
    $element = preg_replace('%</div>%', '', $element);
    $element = preg_replace('%<img height="100" width="100" alt="%', '', $element);
    $element = preg_replace('%src="/imgs/produits/%', '', $element);
    $element = preg_replace('%.jpg"%', '', $element);
    $element = preg_replace('%/>%', '', $element);
    $element = preg_replace('%,%', '', $element);
    $element = preg_replace('%"%', '', $element);
    $element = preg_replace('%'%', '#', $element);$element = preg_replace('%-%', '', $element);
    //resultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     class=illus>
    	fruitsetlegumes/mdd/melangedejeunespousses125g
    	melangedejeunespousses125g src=../imgs/produits/mdd_melange_de_jeunes_pousses_125g.jpg 
            mdd_melange_de_jeunes_pousses_125g.jpg
    Ce que je voudrais comme résultat ce serait plutôt ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boissons sans alcool,jus de fruits,jus de fruit de la marque dupont 2l,3123340444550
    J’espère avoir posté mon message de détresse dans la bonne catégorie, je suis nouveau sur le forum, donc, je n'ai pas encore exploré tout le site.

    Merci pour vos réponses!

  2. #2
    Membre averti

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 205
    Points : 409
    Points
    409
    Billets dans le blog
    1
    Par défaut
    Comme pour ce sujet : utilisez les regexp pour parser une page HTML est lourd et compliqué : difficile de prévoir tous les cas !
    Il vaut mieux utiliser un outil fait exprès pour : le parser DOM de PHP
    http://php.net/manual/fr/book.dom.php

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Ok, merci pour la réponse rapide !
    Je suis un peu novice en développement, je suis plus intégration,
    donc je patauge un peu..
    Je me suis renseigné sur DOM, mais je vois pas comment modifier et intégrer a mon code :
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    <?php
    //URL à crawler
    $url = 'http://MON-URL/';
     
    //déclaration de la fonction de crawl
    function crawl($url)
    {
     
            //initialisation de curl
            $ch = curl_init($url);
     
            //création d'un fichier texte pour stocker le contenu crawlé
            //effacement du fichier précédent si existe
            if(file_exists('fichier_html_brut'))
            {
            	unlink('fichier_html_brut');
            }
            $fp_fichier_html_brut = fopen('fichier_html_brut', 'a');
     
            //définition des paramètres curl
            //1 redirection de l'output dans le fichier txt
            curl_setopt($ch, CURLOPT_FILE, $fp_fichier_html_brut);
     
            //2 on spécifie d'ignorer les headers HTTP
            curl_setopt($ch, CURLOPT_HEADER, 0);
     
            //exécution de curl
            curl_exec($ch);
     
            //fermeture de la session curl
            curl_close($ch);
     
            //fermeture du fichier texte
            fclose($fp_fichier_html_brut);
     
            //passage du contenu du fichier à une variable pour analyse
            $html_brut = file_get_contents('fichier_html_brut');
     
        //extraction du contenu souhaité '...'
        preg_match_all('%<div class="illus">(.*)</div>%Us', $html_brut, $adresses_mail);
     
            //creation d'un fichier pour recevoir le contenu souhaité
            $fp_fichier_emails = fopen('fichier_mails', 'a');
     
            //on creer une boucle pour placer tous le contenu souhaité de la page dans le même fichier
            foreach ($adresses_mail[0] as $element)
            {
     
    	//on "nettoie" le contenu souhaité grâçe à l'utilisation de signes (dans le cas present : %)
        // on selectionne avec '%la selection-souhaité%' et on remplace avec 'selection-remplacé'
        $element = preg_replace('%<div class="illus">%', '', $element);
    	$element = preg_replace('%</div>%', '', $element);
    	$element = preg_replace('%<img height="100" width="100" alt="%', '', $element);
    	$element = preg_replace('%src="/imgs/produits/%', '', $element);
    	$element = preg_replace('%.jpg"%', '', $element);
    	$element = preg_replace('%/>%', '', $element);
    	$element = preg_replace('%,%', '', $element);
    	$element = preg_replace('%"%', '', $element);
    	$element = preg_replace('%'%', '#', $element);$element = preg_replace('%-%', '', $element);
     
    		//on ajoute un retour chariot en fin de ligne pour avoir contenu souhaité par ligne
    		$element .= "\n";
            	fputs($fp_fichier_emails, $element);
            }
     
            fclose($fp_fichier_emails);
     
            //extraction des liens
            preg_match_all('#"/?[a-zA-Z0-9_./-]+\.(php|html|htm)"#', $html_brut, $liens_extraits);
     
            //si le fichier contenant les liens existe déjà
            if (file_exists('liens_a_suivre'))
            {		
            	//on l'ouvre
                    $fp_fichier_liens = fopen('liens_a_suivre', 'a');
     
    		//on créé une boucle pour enregistrer tous les liens ds le fichier
                    foreach ($liens_extraits[0] as $element)
                    {		
                    	//on recharge le contenu dans la variable à chaque tour de boucle
                    	//pour être à jour si le lien est present +sieurs x sur la même page
                    	$gestion_doublons = file_get_contents('liens_a_suivre');
     
                    	//on nettoie les liens
                            $element = preg_replace('#"#', '', $element);
                            $follow_url = $element;
                            $follow_url .= "\n";
     
                            //creation d'un pattern pour la verification ds doublons
                            $pattern = '#'.$follow_url.'#';
     
    			//on verifie grace au pattern précédemment créé
    			//que le lien qu'on vient de capturer n'est pas déjà ds le fichier
                            if (!preg_match($pattern, $gestion_doublons))
                            {
                                    fputs($fp_fichier_liens, $follow_url);
                            }
                    }
            }
     
            //si le fichier contenant les liens n'existe pas 
            else
            {
     
    		//on le créé
                    $fp_fichier_liens = fopen('liens_a_suivre', 'a');
     
    		//puis on fait une boucle pour enregistrer tous les liens dans le même fichier
                    foreach ($liens_extraits[0] as $element)
                    {
                            $element = preg_replace('#"#', '', $element);
                            $follow_url = $element;
                            $follow_url .= "\n";
                            fputs($fp_fichier_liens, $follow_url);
                    }
            }
     
    	//fermeture fu fichier contenant les liens
            fclose($fp_fichier_liens);
     
    }
     
    //on appelle une première fois la fonction avec l'url racine
    crawl($url);
     
     
    //ensuite on ouvre le fichier de liens pour visiter les autres pages du site
    $lire_autres_pages = fopen('liens_a_suivre', 'r');
     
    //on créé une boucle pour visiter chacun des liens
    //on stop cette boucle quand le curseur arrive à la fin du fichier
    $numero_de_ligne = 1;
     
    while(!feof($lire_autres_pages))
    {
        //curl ne comprend que les liens absolus
        //on formate donc nos liens relatifs en liens absolus
        $page_suivante = $url;
        $page_suivante .= fgets($lire_autres_pages);
        echo $numero_de_ligne . ' Analyse en cours, page : ' .  $page_suivante;
        $numero_de_ligne++;
     
        //on se contente de rappeler la fonction crawl avec nos nouveaux liens
        crawl($page_suivante);
    }
     
    fclose ($lire_autres_pages);
     
     
    ?>
    Je dois tout recommencer en fait ?

    Sinon, je suis aussi tombé sur ça en cherchant : http://simplehtmldom.sourceforge.net/
    Vous en pensez quoi ?

    Merci

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Finalement, après avoir vraiment pas mal pataugé, j'ai découvert que la fonction recherche de NotePad++ gère les expressions régulières !

    J'ai donc téléchargé sur mon PC le code source de ma page .html, puis effectué des recherches avec expressions régulières pour le "nettoyer" des informations que je ne voulais pas avec notepad++ en suivant ce guide : http://astuces.jeanviet.info/bureaut...ques-regex.htm

    le résultat final, ma liste de produits prêts à etre up sur joomla :
    contenu1, contenu2, contenu3, contenu4
    contenu1, contenu2, contenu3, contenu4
    etc...

    Merci Notepad++

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

Discussions similaires

  1. [fileupload] problème pour parser la requete
    Par jaimepasteevy dans le forum Struts 1
    Réponses: 12
    Dernier message: 24/04/2008, 12h02
  2. C/asm : problème pour link
    Par SteelBox dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 06/04/2004, 23h03
  3. un batch DOS pour "nettoyer des fichiers" ?
    Par RoroMinator dans le forum Scripts/Batch
    Réponses: 9
    Dernier message: 12/02/2004, 16h24
  4. Réponses: 3
    Dernier message: 29/08/2003, 10h57
  5. Problème pour récupérer la clé primaire
    Par caramel dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 11/04/2003, 13h57

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