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 :

regex capturer une div parmis d'autres [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 31
    Points : 17
    Points
    17
    Par défaut regex capturer une div parmis d'autres
    Bonjour,
    Je souhaite capturer la div "container" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <div class="header"></div>
    <div class="container">
     <div class="inside1-container"></div>
     <div class="inside2-container"></div>
    </div>
    <div style="clear:both"></div>
    <div class="footer"></div>
    J'ai la regex suivante qui marche bien mais qui ne me va pas car je peux être amené à mettre d'autres div entre "container" et "footer" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all('|<div class="container"[^>]+>(.*)</div><div style="clear:both"></div><div class="footer">|msi', $sources, $out);
    J'ai essayé celle-ci qui capture jusqu'à la fin de la div "inside1-container" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all('|<div class="container"[^>]+>(.*?)</div>|msi', $sources, $out);
    J'ai essayé celle-ci qui capture jusqu'à la fin de la div "footer" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all('|<div class="container"[^>]+>(.*)</div>|msi', $sources, $out);

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 842
    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 842
    Points : 6 522
    Points
    6 522
    Par défaut
    Un document html ne se requête pas à coup de regex mais plutôt en utilisant l'arbre DOM via notamment les classes DOMDocument et DOMXPath. Tu trouveras une pléthore de tutoriels sur ce sujet.

    D'une manière plus générale, il est plus facile d'extraire des informations de données structurées en utilisant l'outil le mieux adapté à cette structure. C'est également le cas pour le JSON, les fichiers csv, les objets sérialisés.

    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
    // évite l'affichage automatique de warnings si le html est mal formé.
    libxml_use_internal_errors(true);
     
    $dom = new DOMDocument;
    $dom->loadHTML($html);
     
    $xp = new DOMXPath($dom);
     
    $nodeList = $xp->query('(//div[@class="container"])[1]'); // premier nœud div dont l'attribut class est "container"
     
    if ($nodeList->length) {
        $wholeNode = $dom->saveHTML($nodeList->item(0));
        $content = '';
     
        foreach ($nodeList->item(0)->childNodes as $node) 
            $content .= $dom->saveHTML($node);
     
        echo 'Tag complet:', PHP_EOL, $wholeNode, PHP_EOL;
        echo 'contenu:', PHP_EOL, $content, PHP_EOL;
    }
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 31
    Points : 17
    Points
    17
    Par défaut
    Merci CosmoKnacki,
    En local ton code marche parfaitement.

    En ligne, j'obtiens l'erreur suivante :
    DOMDocument::saveHTML() expects exactly 0 parameters, 1 given

    Surement la version PHP du serveur qui n'est pas assez récente...

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 842
    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 842
    Points : 6 522
    Points
    6 522
    Par défaut
    Dans ce cas remplace saveHTML par saveXML ça devrait passer sur les versions avant 5.3.6.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 31
    Points : 17
    Points
    17
    Par défaut
    Merci,
    Avec saveXML le code est différent de celui restitué par saveHTML.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <div class="container">
     <div class="inside1-container"></div>
     <div class="inside2-container"></div>
     <div style="clear:both"></div>
    </div>
    Devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <div class="container">
     <div class="inside1-container"/></div>
     <div class="inside2-container"/></div>
     <div style="clear:both">
    </div>

  6. #6
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 842
    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 842
    Points : 6 522
    Points
    6 522
    Par défaut
    Oui car en enregistrant en XML les balises vides sont automatiquement écrites comme des 'self closing tags' (~balises auto-fermantes). Dans ce cas tu peux utiliser l'option LIBXML_NOEMPTYTAG:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $dom->saveXML($nodeList->item(0), LIBXML_NOEMPTYTAG);
    Par contre cette option aura l'effet contraire, car si les balises vides seront laissées telles quelles, les balises auto-fermantes, comme <br/> ou <img src="truc"/>, deviendront <br></br> et <img src="truc"></img>.

    C'est plutôt facile à contrecarrer mais ça reste du bricolage, l'idéal étant de changer de serveur ou de mettre à jour la version de PHP qui date un peu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $wholeNode = removeClosingTags($wholeNode);
    $content = removeClosingTags($content);
     
    function removeClosingTags($html) {
        $closingTags = array('</area>', '</base>', '</br>', '</col>', '</command>', '</embed>',
                             '</hr>', '</img>', '</input>', '</keygen>', '</link>', '</meta>',
                             '</param>', '</source>', '</track>', '</wbr>');
     
        return str_replace($closingTags, '', $html);
    }
    Maintenant tu peux peut-être t'éviter ces désagréments, tout dépend de ce que tu veux faire de ton bout de code.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 31
    Points : 17
    Points
    17
    Par défaut
    Merci CosmoKnacki,
    Effectivement, je vais mettre à jour le serveur pour bénéficier de saveHTML et alléger le code.
    En attendant, j'ai adapté ton dernier script qui fonctionne très bien.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/08/2013, 20h43
  2. Réponses: 3
    Dernier message: 11/06/2013, 15h36
  3. Changer le contenu d'une div dans un autre document
    Par francois6 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 24/11/2011, 12h05
  4. centrer horizontalement une div dans un autre
    Par penguin50 dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 04/04/2008, 09h35
  5. [Débutant] Appeler ou activer une figure parmi d'autres
    Par joris15105 dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 28/02/2008, 14h22

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