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 :

Quelles fonctions pour parser du HTML ET modifier le contenu? [PHP 5.2]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Nixar
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 302
    Par défaut Quelles fonctions pour parser du HTML ET modifier le contenu?
    Bonjour à tous,

    Je cherche à parser un string qui contient la sortie d'une page HTML. Mon but est de retrouver les <ul> qui sont elles-mêmes contenues dans des <ul> pour leur ajouter des <li></li> englobant (le WYSIWYG utilisé pour générer le HTML ne respecte pas la norme).

    En résumé, j'ai quelque chose comme ça :
    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
     
    <ul>
    	<li>1 zone de rencontre en projet (env 300 hab) :</li>
    	<ul>
    		<li>Communication : posters, lettre, flyers</li>
    		<li>Sensibilisation : radar pédagogique</li>
    		<li>activités participatives avec les habitants :</li>
    		<ul>
    			<li>enquête stationnement,</li>
    			<li>une réunion de lancement,</li>
    			<li>un atelier-promenade,</li>
    			<li>et 2 stands-projet.</li>
    			<li>Réunions publiques.</li>
    		</ul>
    	</ul>
    	<li>2 rues pour enfants le 15/06/11 et 5/10/11 soit :</li>
    	<ul>
    		<li>env 135 adultes et 250 enfants participants</li>
    		<li>env 25/30 personnes impliquées</li>
    		<li>env une dizaine d’activités proposées</li>
    	</ul>
    </ul>

    et je souhaite ça :

    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
     
    <ul>
    	<li>1 zone de rencontre en projet (env 300 hab) :</li>
    	<li>
    		<ul>
    			<li>Communication : posters, lettre, flyers</li>
    			<li>Sensibilisation : radar pédagogique</li>
    			<li>activités participatives avec les habitants :</li>
    			<li>
    				<ul>
    					<li>enquête stationnement,</li>
    					<li>une réunion de lancement,</li>
    					<li>un atelier-promenade,</li>
    					<li>et 2 stands-projet.</li>
    					<li>Réunions publiques.</li>
    				</ul>
    			</li>
    		</ul>
    	</li>
    	<li>2 rues pour enfants le 15/06/11 et 5/10/11 soit :</li>
    	<li>
    		<ul>
    			<li>env 135 adultes et 250 enfants participants</li>
    			<li>env 25/30 personnes impliquées</li>
    			<li>env une dizaine d’activités proposées</li>
    		</ul>
    	</li>
    </ul>
    J'ai regardé du côté des RegEx, c'est assez compliqué et pas forcément adapté. Du coup je me tourne vers le parsing via la classe DOM Document de PHP mais je ne vois pas comment à la fois faire ma recherche de tags (<ul> fille dans mon cas) et en suivant modifier ces tags...

    Avez-vous une idée?

    Merci pour vos retours !

    Nicolas

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut

    Avec DOM, pour rechercher et extraire des tags on utilise DOMXPath, ensuite tu peux très bien faire toutes les modifs que tu veux sur le résultat obtenu.

  3. #3
    Membre éclairé Avatar de Nixar
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 302
    Par défaut
    Merci pour ta réponse. Si je reprends tout ça, voici ce que ça me donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
       // Load content
       $dom = new DOMDocument;
       $dom->loadHTML($html); 
     
       $xpath = new DOMXpath($dom);
     
     
       // Get all child ul
       $path = '//ul//ul';
       $uls = $xpath->query($path);
    J'ai mes ul. Maintenant, je ne vois pas comment changer <ul></ul> par <li><ul></ul></li>...

    Tu pourrais m'éclairer?

    Merci !

  4. #4
    Membre éclairé Avatar de Nixar
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 302
    Par défaut
    Je suis parti sur quelque chose comme ça :

    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
    // Load content
       $dom = new DOMDocument;
       $dom->loadHTML($html); 
       // Clear all errors
       libxml_clear_errors();
     
       $xpath = new DOMXpath($dom);
     
     
       // Get all child ul
       $path = '//ul//ul';
       $uls = $xpath->query($path);
     
       for($i=0;$i<$uls->length;$i++) {
           $ul = $uls->item($i);
           $li_container = $dom->createElement('li');
           $li_container->appendChild($ul);
           $dom->replaceChild($li_container, $ul);
       }
    Sauf que maintenant, j'ai une sorte d'erreur inconnue:

    Fatal error: Uncaught exception 'DOMException' with message 'Not Found Error'
    Je précise que mon HTML n'est malheureusement pas valide du tout... Il comporte des balises custom. C'est pour ça que j'ai désactivé les erreurs.

    Peut-être qu'en utilisant un chargement XML pur?

    Merci pour vos avis,

    Nicolas

  5. #5
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Bon allez parce que c'est toi,
    [mode=distributeur_de_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
    <?php
     
    $xml = <<<'XML'
    <ul>
       <li>1 zone de rencontre en projet (env 300 hab) :</li>
       <ul>
          <li>Communication : posters, lettre, flyers</li>
          <li>Sensibilisation : radar pédagogique</li>
          <li>activités participatives avec les habitants :</li>
          <ul>
             <li>enquête stationnement,</li>
             <li>une réunion de lancement,</li>
             <li>un atelier-promenade,</li>
             <li>et 2 stands-projet.</li>
             <li>Réunions publiques.</li>
          </ul>
       </ul>
       <li>2 rues pour enfants le 15/06/11 et 5/10/11 soit :</li>
       <ul>
          <li>env 135 adultes et 250 enfants participants</li>
          <li>env 25/30 personnes impliquées</li>
          <li>env une dizaine d’activités proposées</li>
       </ul>
    </ul>
    XML;
     
    function nestUl($xml, $xpath)
    {
       $dom = new DOMDocument();
       $dom->loadXML($xml);
     
       $dom_xpath = new DOMXPath($dom);
       $nodes = $dom_xpath->query($xpath);
     
       foreach($nodes as $node) {
          $li = $dom->createElement('li');
          $li->appendChild($node->cloneNode(true));
          $node->parentNode->replaceChild($li, $node);
       }
       return $dom->saveXML();
    }
     
    $xml = nestUl($xml, 'ul/ul');
    $xml = nestUl($xml, '/ul/ul');
     
    echo $xml;
     
    ?>


    Et le résulat chez moi :
    Code xml : 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
    <?xml version="1.0" ?> 
    <ul>
       <li>1 zone de rencontre en projet (env 300 hab) :</li> 
       <li>
          <ul>
             <li>Communication : posters, lettre, flyers</li> 
             <li>Sensibilisation : radar pédagogique</li> 
             <li>activités participatives avec les habitants :</li> 
             <li>
                <ul>
                   <li>enquête stationnement,</li> 
                   <li>une réunion de lancement,</li> 
                   <li>un atelier-promenade,</li> 
                   <li>et 2 stands-projet.</li> 
                   <li>Réunions publiques.</li> 
                </ul>
             </li>
          </ul>
       </li>
       <li>2 rues pour enfants le 15/06/11 et 5/10/11 soit :</li> 
       <li>
          <ul>
             <li>env 135 adultes et 250 enfants participants</li> 
             <li>env 25/30 personnes impliquées</li> 
             <li>env une dizaine d’activités proposées</li> 
          </ul>
      </li>
    </ul>

  6. #6
    Membre éclairé Avatar de Nixar
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 302
    Par défaut
    Alors écoute parce que c'est toi merci beaucoup... Ca fonctionne très bien .

    Une dernière petite question (en fait 2) : bien que ce ne soit pas de l'HTML valide, il est appelé à être utilisé en tant que tel (si tu connais, je génère une page pour la bibliothèque HTML2PDF)...

    1. Je reçois une variable qui contient mon pseudo HTML. Comment puis lui ajouter dynamiquement les attributs que tu as rajouté (<<<'XML' et XML)
    2. Comment puis-je faire l'opération inverse une fois le parsing et les changements effectués afin de récupérer mon pseudo code HTML à nouveau??


    Merci vraiment beaucoup pour tes réponses !

    Nicolas

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/10/2011, 12h35
  2. quelle fonction pour eteindre ?
    Par mitherkiller dans le forum C#
    Réponses: 1
    Dernier message: 24/01/2007, 21h35
  3. [Tableaux] Besoin d'aide pour parser du HTML
    Par vallica dans le forum Langage
    Réponses: 2
    Dernier message: 08/10/2006, 22h12
  4. Réponses: 8
    Dernier message: 08/04/2006, 18h43
  5. [Html] HTMLPARSER pour parser du html en Java
    Par alexthomas dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 01/09/2005, 21h11

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