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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    sans
    Inscrit en
    Mars 2020
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mars 2020
    Messages : 182
    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 confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 697
    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 confirmé
    Homme Profil pro
    sans
    Inscrit en
    Mars 2020
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mars 2020
    Messages : 182
    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 confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 697
    Détails du profil
    Informations personnelles :
    Localisation : France

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

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

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mars 2020
    Messages : 182
    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 confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    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 986
    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.

+ 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