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 :

file_get_contents et regex


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut file_get_contents et regex
    j'ai un fournisseur qui me demande de recuperer les infos produit directement sur leur site avec file_get_contents
    $fich ='http://www.espacepc.com/wdbox/aspglobal/wdb_lb.asp?Args=DATA:espacePC$TABLE:Listearticles$DOSSIER:espacePC$WHERE:%28chronoA=5300%29$HTMR:fiche';
    $thefile = file_get_contents($fich);
    preg_match_all('#(.*)Caractéristiques(.*)#', $thefile, $out);
    print_r($out);
    je voudrais recuperer sur un fichier excel le contenu de la rubrique
    Caractéristiques mais j'ai çà comme résultat
    Array
    (
    [0] => Array
    (
    [0] => Caractéristiques
    )

    [1] => Array
    (
    [0] =>
    )

    [2] => Array
    (
    [0] =>
    )

    )
    je ne comprends riens là.
    merci pour votre precieuse aide

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

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Salut,

    Tu ne nous donnes pas beaucoup de données pour réfléchir...

    Dans un premier temps, je tenterais le DOT_MATCH_ALL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all('#(.*)Caractéristiques(.*)#s', $thefile, $out);
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  3. #3
    Membre actif Avatar de John Blobsmith
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 198
    Points : 223
    Points
    223
    Par défaut
    moi j'ai compris qu'il voulais faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $fich ='http://www.espacepc.com/wdbox/aspglobal/wdb_lb.asp?Args=DATA:espacePC$TABLE:Listearticles$DOSSIER:espacePC$WHERE:%28chronoA=5300%29$HTMR:fiche';
    $thefile = file_get_contents($fich);
    preg_match_all('#Caractéristiques</td>(.*)</table>#Uis', $thefile, $out);
    print_r(trim(strip_tags($out[1][0],'<br>')));

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    Citation Envoyé par John Blobsmith Voir le message
    moi j'ai compris qu'il voulais faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $fich ='http://www.espacepc.com/wdbox/aspglobal/wdb_lb.asp?Args=DATA:espacePC$TABLE:Listearticles$DOSSIER:espacePC$WHERE:%28chronoA=5300%29$HTMR:fiche';
    $thefile = file_get_contents($fich);
    preg_match_all('#Caractéristiques</td>(.*)</table>#Uis', $thefile, $out);
    print_r(trim(strip_tags($out[1][0],'<br>')));
    super c'est ca :
    par contre j'ai pas compris pourquoi il faut ajouter ca .est ce obligatoire ?
    Uis
    et pourquoi cà car je ne trouve pas dans le code source de la page
    </table>
    le code source est plutot
    <td colspan="4" class="txttitre p05 GC">Caractéristiques</td>
    </tr>
    <tr>
    <td colspan="4" class="txt p05">Station d’accueil USB v2.0/eSATA pour disque dur SATA 3½’’/2½’’<br>

    Bouton de sauvegarde OTB sous Windows avec utilitaire<br>
    Alimenté par adaptateur secteur externe. Interrupteur marche/arrêt<br>
    Indicateurs lumineux pour l’état de marche et l’activité<br>
    Ejection et insertion facile du disque dur<br>
    Windows 2000/XP/VISTA et MAC OS 10</td>
    </tr>
    et pourquoi un trim dans print_r(trim(strip_tags($out[1][0],'<br>')));

  5. #5
    Membre actif Avatar de John Blobsmith
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 198
    Points : 223
    Points
    223
    Par défaut
    c'est des options pour le regex, dans ce cas U ne serai pas obligatoire. Moi je les met toujours comme ca y'a pas de surprise. Leur effet a été détaillé 3 posts plus loin sur ce forum.
    http://www.developpez.net/forums/d89...struire-regex/

    entre "Caractéristiques" et le texte y'a plein de balise mais pas de </table> du coup je l'utilise en fin de regex pour lui dire -> arrête toi ici.

    je vire toutes les balises inutiles genre "<tr>" et "<td>" qui ne me servent plus mais je conserve les "br" pour la mise en forme.

    j'enlève les espèce en début et en fin de texte, ca doit être utile pour mettre le texte dans un fichier excel mais si c'est pour le ré-afficher sur une page web y'a peut-être pas besoin.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    merci john
    en fait j'aimerais recuperer 3 bloc dans la page
    le 1er
    </tbody></table></td>
    </tr>
    <tr>
    <td valign="top"><table class="w100per">
    <tbody><tr>
    <td colspan="4" class="prodtitre2 p10">STATION HDD SATA CONNECTEURS USB+eSATA<br>
    <span class="prod2">Réf. 6001001 DOCK-CNL-SCBT

    <br>
    Code barres : 3700284609377
    le deuxieme bloc est celui de la rubrique par Présentation
    <tr>
    <td colspan="4" class="txttitre p05 GC">Présentation</td>
    </tr>
    <tr>
    <td colspan="4" class="txt p05">Insérez un disque dur SATA 3.5’’ ou 2.5’’ puis connectez-le au port eSATA ou USB<br>
    de votre ordinateur pour sauvegarder vos données.<br>
    Cette station dispose d'un levier pour enlever facilement le disque dur.<br>
    Elle incorpore la fonction et un bouton de sauvegarde OTB pour effectuer des<br>

    sauvegardes régulières sous WINDOWS et uniquement en mode USB.<br>
    Elle est alimentée par une alimentation externe.</td>
    </tr>



    <tr>
    <td colspan="4" class="p05"></td>
    </tr>

    <tr>
    et le dernier bloc est celui de la rubrique Caractéristiques
    (ce dernier , ton code permet de recuperer sans souci )
    j'aimerais recuperer les 2 premiers en m'inspirant de ta méthode
    pour le premier bloc
    j'ai fait ca mais ca ne marche pas non plus
    preg_match_all('#<tbody><tr><td colspan="4" class="prodtitre2 p10">[^</span></td>]*</span></td>#Us', $thefile, $out);
    pour le bloc presentation j'ai essayé 2 methode mais aucun ne marche
    preg_match_all('#Présentation</td>(.*)</table>#Us', $thefile, $out);
    preg_match_all('#Présentation[^</td>]*</td>#Us', $thefile, $out);
    c'est quoi encore le souci .je me prends la tete mais pas vraiment d'idée là.

  7. #7
    Membre actif Avatar de John Blobsmith
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 198
    Points : 223
    Points
    223
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    preg_match_all('#<td colspan="4" class="prodtitre2 p10">(.*)</span>#Uis', $thefile, $out);
    print_r(trim(strip_tags($out[1][0],'<br>')));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    preg_match_all('#Pr&eacute;sentation</td>(.*)<td colspan="4" class="p05"></td>#Uis', $thefile, $out);
    print_r(trim(strip_tags($out[1][0],'<br>')));

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    encore merci John.t'as tout bon .
    1-toutefois pour que je comprenne mieux j'ai essayé avec présentation et non
    Pr&eacute;sentation.effectivement ca ne marche pas mais je ne comprends pas pourquoi car quand je regarde le code source c'est bien le mot présentation qui est affiché
    preg_match_all('#Présentation</td>(.*)<td colspan="4" class="p05"></td>#Uis', $thefile, $out);
    2-
    je ne comprends pas pourquoi ce code ne marche pas .Dapres ce que je comprends .ce code recupere apres <td colspan="4" class="prodtitre2 p10"> tous les mots jusqu'au prochain mot </span> trouvé .Donc ca devrait marcher et ben non
    preg_match_all('#<td colspan="4" class="prodtitre2 p10">[^</span>]*</span>#Usi', $thefile, $out);
    merci encore merci à john pour ton aide précieux

  9. #9
    Membre actif Avatar de John Blobsmith
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 198
    Points : 223
    Points
    223
    Par défaut
    Citation Envoyé par bigs3232 Voir le message
    encore merci John.t'as tout bon .
    1-toutefois pour que je comprenne mieux j'ai essayé avec présentation et non
    Pr&eacute;sentation.effectivement ca ne marche pas mais je ne comprends pas pourquoi car quand je regarde le code source c'est bien le mot présentation qui est affiché
    Moi quant je regarde le code source je vois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <td colspan="4" class="txttitre p05 GC">Pr&eacute;sentation</td>
    Citation Envoyé par bigs3232 Voir le message
    2-
    preg_match_all('#<td colspan="4" class="prodtitre2 p10">[^</span>]*</span>#Usi', $thefile, $out);
    - Déja y'a pas de parenthèses du coup tu récupèrera jamais le résultat.
    - ca -> [^</span>] ca veux dire tout a part ^ ou < ou / ou s ou p ou a ou n ou >, donc c'est pas ce qu'on veux.


    Citation Envoyé par bigs3232 Voir le message
    merci encore merci à john pour ton aide précieux
    Pas de quoi.

  10. #10
    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
    Tu ferais mieux d'utiliser une biblio comme :
    http://simplehtmldom.sourceforge.net/

    pour parser ton HTML, c'est 1000 fois plus propre et "fait pour" que des expressions régulières...

  11. #11
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Citation Envoyé par asdf007 Voir le message
    Tu ferais mieux d'utiliser une biblio comme :
    http://simplehtmldom.sourceforge.net/
    Entièrement d'accord si il doit extraire de nombreuses informations du document HTML.
    pour parser ton HTML, c'est 1000 fois plus propre et "fait pour" que des expressions régulières...
    Cette classe s'appuie elle-même sur des expressions régulières. Donc ce que tu dis n'est pas très juste.

    Aussi, il faut que la regex soit non-gourmande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    '#(.*?)Caractéristiques(.*?)#',
    $1 : l'ensemble du texte contenu entre # et Caractéristiques.
    $2 : l'ensemble du texte contenu entre Caractéristiques et #

  12. #12
    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
    Citation Envoyé par ThomasR Voir le message
    Entièrement d'accord si il doit extraire de nombreuses informations du document HTML.
    Si c'est juste une info à un endroit précis dans un doc HTML et qui implique une regexp à peu près lisible, éventuellement ; dans tout autre cas plus complexe/fréquent c'est vraiment peu recommandé amha.

    Cette classe s'appuie elle-même sur des expressions régulières. Donc ce que tu dis n'est pas très juste.
    Justement : le code derrière est complexe et difficilement lisible. Reste qu'il produit un parseur complet qui gère des choses comme la récurrence qui sont très chiantes à faire "from scratch" avec des regexp.

    C'est l'assurance d'avoir un parsing fiable, hyper lisible/maintenable tout en étant très correctement optimisé.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    Citation Envoyé par ThomasR Voir le message
    Entièrement d'accord si il doit extraire de nombreuses informations du document HTML.

    Cette classe s'appuie elle-même sur des expressions régulières. Donc ce que tu dis n'est pas très juste.

    Aussi, il faut que la regex soit non-gourmande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    '#(.*?)Caractéristiques(.*?)#',
    $1 : l'ensemble du texte contenu entre # et Caractéristiques.
    $2 : l'ensemble du texte contenu entre Caractéristiques et #
    merci à asdf007 pour ton lien .c'est la 1em fois que je vais utiliser une librairie.
    je vais voir comment ca marche .
    sinon thomas j'ai essayé ton code pour voir , apparamment ca ne marche pas
    preg_match_all('#(.*?)Caractéristiques(.*?)#s', $thefile, $out);
    print_r($out);

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    petite question à thomas pour son code .
    pourquoi ? dans (.*?)
    si d'autres personnes que thomas peut eclairer ma lanterne .je dirais pas non
    merci d'avance
    '#(.*?)Caractéristiques(.*?)#'

  15. #15
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    C'est un opérateur qui permet à l'expression d'être non gourmande, cela permet de ne prendre que la plus petite partie possible répondant à ton motif.

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    Citation Envoyé par ThomasR Voir le message
    C'est un opérateur qui permet à l'expression d'être non gourmande, cela permet de ne prendre que la plus petite partie possible répondant à ton motif.
    ca (.*) je comprends :quel que soit n'importe quel caractere soit 0,1, plusieurs fois
    mais ca (.*?) =>quel que soit n'importe quel caractere soit 0,1, plusieurs fois c'est çà?

  17. #17
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Si tu ne met que (.*?) et que tu ne précises aucun motif autour, cela renverra la même chose que (.*), c'est à dire tout.

    Imagines une chaine :
    Appliquer le motif ;(.*); renvoie une occurence:
    Appliquer ;(.*?); renvoie plusieurs occurences :

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    purée merci .si tu m'avais dit plutot j'aurais pas à me prendre la tête depuis 2heures.mon bug vient de là.
    merci quand meme

  19. #19
    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
    Citation Envoyé par bigs3232 Voir le message
    purée merci .si tu m'avais dit plutot j'aurais pas à me prendre la tête depuis 2heures.mon bug vient de là.
    merci quand meme
    Ou alors t'aurais pu taper "expressions régulières" sur google comme un grand et apprendre à t'en servir, tout simplement...

  20. #20
    Membre actif Avatar de John Blobsmith
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 198
    Points : 223
    Points
    223
    Par défaut
    Citation Envoyé par ThomasR Voir le message
    Si tu ne met que (.*?) et que tu ne précises aucun motif autour, cela renverra la même chose que (.*), c'est à dire tout.

    Imagines une chaine :
    Appliquer le motif ;(.*); renvoie une occurence:
    Appliquer ;(.*?); renvoie plusieurs occurences :
    Tout dépend avec quelle fonction et quelle option tu l'utilise...
    Je trouve ca intéressant mais je trouve pas le même résultat que toi, peux tu me montrer le code php utilisé pour arriver à ce résultat ?

Discussions similaires

  1. [Regex] Plusieurs motifs
    Par sissi_l dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 29/06/2004, 14h15
  2. [jakarta][regex]Matcher mot en entier.
    Par thibaut dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 26/05/2004, 13h33
  3. [Regex] Vérifier qu'une chaîne respecte une expression régulière
    Par PeteMitchell dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 13/05/2004, 14h22
  4. [regex][string] replaceAll bogué ?
    Par 7eme dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 13/11/2003, 16h36
  5. Cherche regex...
    Par laurent_h dans le forum C
    Réponses: 4
    Dernier message: 31/03/2003, 11h24

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