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 :

Parser une page HTML : Regex ou DOMDocument() [PHP 7]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    sans
    Inscrit en
    Mars 2020
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mars 2020
    Messages : 182
    Points : 117
    Points
    117
    Par défaut Parser une page HTML : Regex ou DOMDocument()
    Bonjour

    J'essaie de parser une page html qui est construite comme ceci

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ...
    <section class="ui grid topbar">
    <div class="ui row">
     
            ... des divs etc
     
        </div>
    </section>
    ...

    Pour cela j'essaie avec la regex qui selon moi veut dire de sélectionner n'importe quel caractère en n importe quelle quantité entre les deux balises section:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $strResult = implode("", file("test_1.php"));
    $pattern = '#<section(.*)<\/section>#';
    preg_match_all($pattern, $strResult, $n);
    echo '<pre>';
    var_dump($n);

    le resultat est vide :

    array(2) {
    [0]=>
    array(0) {
    }
    [1]=>
    array(0) {
    }
    }
    J'essaie alors avec DOMDocument() avec ce code qui selon moi devrait extraire des blocs de code délimités par le tag 'section'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $doc = new DOMDocument();
    $doc->loadHTMLFile("test_1.php");
    $elements = $doc->getElementsByTagName('section');
    echo '<pre>';
    var_dump($elements);
    mais là aussi le résultat est vide :
    bject(DOMNodeList)#2 (1) {
    ["length"]=>
    int(0)
    }
    Question : Comment dois-je donc procéder pour parser une page HTML et en extraire le code entre les balises section ? L un est elle préférable à l 'autre et quelle sont donc mes erreurs pour obtenir un résultat vide ?
    Merci pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    pour l'expression régulière, il faut rajouter l'option "s" pour indiquer que le point inclut les sauts à la ligne :
    https://www.php.net/manual/fr/refere....modifiers.php

  3. #3
    Membre régulier
    Homme Profil pro
    sans
    Inscrit en
    Mars 2020
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mars 2020
    Messages : 182
    Points : 117
    Points
    117
    Par défaut
    Merci pour cette réponse mais je teste et rien pourtant d apres les propriétés, tout est correct, selon ma logique

    . matches any character (except for line terminators)
    * matches the previous token between zero and unlimited times, as many times as possible, giving back as needed (greedy)
    \s matches any whitespace character (equivalent to [\r\n\t\f\v ])
    J ai mis en ligne ici https://regex101.com/r/f5l0cB/1

  4. #4
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    le "s" doit être mis à la fin de la regex
    https://regex101.com/r/nn8pbs/1

  5. #5
    Membre régulier
    Homme Profil pro
    sans
    Inscrit en
    Mars 2020
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mars 2020
    Messages : 182
    Points : 117
    Points
    117
    Par défaut
    Merci mais visiblement j ai pas saisi un truc
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <section class="ui grid topbar">
    une ligne
     
    </section>
    <section class="ui grid topbar">
    <div class="ui row">
     
            ... des divs etc
     
        </div>
    </section>
    là j ai fait en sorte d avoir 2 resultats mais la regex <section(.*)<\/section>\s ne retourne rien
    alors que si j ai ce code
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <section class="ui grid topbar">une ligne</section>
    <section class="ui grid topbar">
    <div class="ui row">
     
            ... des divs etc
     
        </div>
    </section>
    elle retourne la première et seulement la première ligne

  6. #6
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Le problème vient du fait que ton fichier n'est pas chargé correctement. La première chose à faire est d'essayer de charger ton fichier avec file_get_contents() et de voir si tu obtiens quelque chose! (à toi si ça ne fonctionne pas de trouver l'origine du problème: mauvaise url?, manque un contexte de flux?). Ça ne sert à rien d'aller plus avant si tu restes coincé à cette étape.

    D'autre part, je trouve malheureux que tu n'envisages DOMDocument qu'en deuxième solution pour parser un fichier html, alors que c'est l'outil approprié, les regex sont à éviter pour ce genre de tâches.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  7. #7
    Membre régulier
    Homme Profil pro
    sans
    Inscrit en
    Mars 2020
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mars 2020
    Messages : 182
    Points : 117
    Points
    117
    Par défaut
    Merci, effectivement, je ne sais pas pourquoi mais c est bien la lecture du fichier enregistré qui posait problème.

    je trouve malheureux que tu n'envisages DOMDocument qu'en deuxième solution pour parser un fichier html
    Quand j ai cherché comment parser une page html, j ai découvert cette solution. Je l ai testé mais résultat vide (à cause du fichier mais je ne le savais pas). Mais c est bel et bien ce qe j utilise maintenant que tu m as donné la solution à mon pb car c est tellement plus simple et j imagine même que côté performance, ce doit être bien mieux.
    merci encore !

  8. #8
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    j imagine même que côté performance, ce doit être bien mieux.
    Pas forcément parce que l'utilisation de DOMDocument::loadHTMLFile() nécessite de parser intégralement le fichier et de créer tout un arbre composé de nombreux objets afin qu'il soit ensuite interrogeable et manipulable. Néanmoins, plus tu auras de tâches à effectuer dessus plus ce coût de départ sera amorti. Mais le principale avantage de DOMDocument est de sa capacité à parser correctement le code HTML, ce qui est très complexe à faire avec une approche directe à base de regex ou de fonctions de manipulation de chaîne. Le HTML est un langage dont la syntaxe est bien plus complexe et piégeuse qu'il n'y parait. DOMDocument a de plus une certaine tolérance au code HTML malformé et ouvre à une énorme palette d'outils.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

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

Discussions similaires

  1. Parser une page HTML avec du PHP
    Par Richard_Rahl dans le forum Langage
    Réponses: 9
    Dernier message: 19/08/2008, 15h36
  2. Parser une page html ?
    Par SimoX1 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 03/12/2006, 19h10
  3. Parser une page Html pour récuperer valeur
    Par Andry dans le forum Delphi
    Réponses: 5
    Dernier message: 01/12/2006, 17h10
  4. Parser une page html, quel outil ?
    Par ggnore dans le forum Linux
    Réponses: 5
    Dernier message: 28/11/2006, 11h48
  5. parser une page HTML pour en retirer de l'info
    Par belakhdarbts10 dans le forum ASP
    Réponses: 1
    Dernier message: 29/10/2006, 18h38

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