Extraire le contenu entre deux balises HTML [Résolu/Fermé]

Signaler
Messages postés
203
Date d'inscription
lundi 24 septembre 2012
Statut
Membre
Dernière intervention
28 juin 2017
-
Messages postés
5473
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
18 février 2021
-
Bonjour,

Je cherche un code en PHP qui permet d'extraire le contenu d'une chaîne de caractères qui se trouve entre deux balises HTML sur un site externe.

Imaginons que je veut extraire mon pseudo qui est sur "commentcamarche.com"

Je vais devoir faire un truc du genre

preg_match('<a href="user/profil" class="userName boxButton">(.+?) // Pseudo</a>');

Bon comme vous pouvez le voir,c'est un code qui ne marche pas, et en plus je ne sais pas comment déclarée le site à visiter pour extraire tout ça...

Merci de bien m'aider.

3 réponses

Messages postés
203
Date d'inscription
lundi 24 septembre 2012
Statut
Membre
Dernière intervention
28 juin 2017
28
up
Messages postés
5473
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
18 février 2021
925
Salut Rayfi,

Sur l'exemple du code de la page de ccm d'un utilisateur authentifié, tu peux faire comme cela :
<?php

$value = '
    <li id="user">
        <a href="/profile/user/%5BDal%5D" class="userName boxButton">
            [Dal]        </a>
        <a href="/forum/inbox/" class="newMsg">
                    <img src="http://static.ccm2.net/www.commentcamarche.net/_skin/_common/img/ico_noMsg.gif?54344445544" alt="0 nouveau(x) message(s)" />
                        </a>
        <div class="boxHover" style="font-size:120%">
            <form id="user_pref_boxhover">';

if (preg_match('#class="userName boxButton">\s+([^\s]+)\s+</a>#s', $value, $matches)) {
    echo "Le pseudo a été trouvé : " . $matches[1];
} else {
    echo "Le pseudo n'a pas été trouvé";
}

?>

Bien sûr, tu ne peux pas obtenir le code html de cette page à partir d'un serveur Php, à moins de gérer l'authentification de l'utilisateur.

Tu peux récupérer le code html d'une page (et faire plein d'autres choses) avec Php curl : https://www.php.net/manual/fr/book.curl.php


Dal
Messages postés
15
Date d'inscription
mercredi 5 juin 2013
Statut
Membre
Dernière intervention
6 juin 2013
2
Pour un tag simple
//Début et fermeture du tag
 $posd = '<h2';
 $pose = '</h2>';
 $pos1 = strpos($CONTENT, $posd);
 $pos1 = strpos($CONTENT, '>', $pos1);
 $pos2 = strpos($CONTENT, $pose);
 

//On affiche l'intérieur du tag
echo substr ( $CONTENT , $pos1+strlen($posd) , $pos2-$pos1-strlen($posd) );



Si tu cherche a parti d'un indice :


//Début et fermeture du tag

Indice se trouvant le plus proche possible après le tag recherché
$where='// Pseudo';
 
 $posd = '<a';
 $pose = '</a>';
 $pos1 = strpos($CONTENT, $where);
 $pos1 = strripos($CONTENT, $posd ,$pos1);
 $pos1 = strpos($CONTENT, '>', $pos1);
 $pos2 = strpos($CONTENT, $pose);
 

//On affiche l'intérieur du tag
echo substr ( $CONTENT , $pos1+strlen($posd) , $pos2-$pos1-strlen($posd) );



Des fois les codes compliqué nous empêche de comprendre le processus, alors simplifions pour mieux comprendre.

Un gracieuseté de http://webpremium.ca

Seul les génies constatent les erreurs !
Messages postés
5473
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
18 février 2021
925
Bonjour Franky do,

Bienvenue sur CCM :-).

Quelques remarques

Ton 1er code ne fonctionne pas s'il y a plus d'un tag de ce type. Il ne va trouver que le premier.

Ton 2ème code n'a pas l'air de fonctionner, ou alors, je ne vois pas ce que tu entends par "indice". Dans le cas présent, ce qui est entre les balises est ce que l'on cherche. Donc, on n'a pas d'indices sur cela, et "// Pseudo" est juste un commentaire que Rayfi inclue dans son exemple, et qui ne fait pas partie du html présent dans le contenu. L'indice en question ne semble pas non plus pouvoir être tu texte contenu dans la balise ouvrante (ou j'ai mal compris).

Le résultat du code suivant, avec un code html de base plus complet teste tes solutions et la mienne (ce que l'on cherche est ce qui est en gras) :

<?php

$value = <<<EOT
            <a href="/" name="top" title="CommentCaMarche"><img src="http://static.ccm2.net/www.commentcamarche.net/_skin/_local/img/logo.png?201007091112"  alt="CommentCaMarche" /></a>
        </div>
        <form action="/search/index" method="get" class="headerFooter">
            <fieldset>
                <legend>Recherche</legend>
                <input type="text" id="searchform_input" name="q" class="search" value="Rechercher" onfocus="if($('searchform_focused').value==0){ $('searchform_input').value=''; $('searchform_focused').value=1; };" />
                <input type="hidden" id="searchform_focused" name="already_focused" value="0" />
                <input type="submit" class="submit" value="OK" />
            </fieldset>
        </form><script type="text/javascript">
            //<![CDATA[
            q = refk();
            if($('searchform_input')&&q&&q!=' ') {
                $('searchform_input').value=q;
                $('searchform_focused').value=1;
            }
            //]]>
        </script>
        <div id="topNav"><ul>
    <li id="user">
    <li id="user">
        <a href="/profile/user/%5BDal%5D" class="userName boxButton">
            [Dal]        </a>
        <a href="/forum/inbox/" class="newMsg">
                    <img src="http://static.ccm2.net/www.commentcamarche.net/_skin/_common/img/ico_noMsg.gif?54344445544" alt="0 nouveau(x) message(s)" />
                        </a>
        <div class="boxHover" style="font-size:120%">
            <form id="user_pref_boxhover">
EOT
;

if (preg_match('#class="userName boxButton">\s+([^\s]+)\s+</a>#s', $value, $matches)) {
    echo "Le pseudo a été trouvé : " . $matches[1];
} else {
    echo "Le pseudo n'a pas été trouvé";
}

$CONTENT = $value;
//Début et fermeture du tag
 $posd = '<a';
 $pose = '</a>';
 $pos1 = strpos($CONTENT, $posd);
 $pos1 = strpos($CONTENT, '>', $pos1);
 $pos2 = strpos($CONTENT, $pose);


//On affiche l'intérieur du tag
echo "<p>Résultat 1 : " . substr ( $CONTENT , $pos1+strlen($posd) , $pos2-$pos1-strlen($posd) ) . "</p>";

// Si tu cherche a parti d'un indice :

//Début et fermeture du tag

// Indice se trouvant le plus proche possible après le tag recherché
$where='userName boxButton';

 $posd = '<a';
 $pose = '</a>';
 $pos1 = strpos($CONTENT, $where);
 $pos1 = strripos($CONTENT, $posd ,$pos1);
 $pos1 = strpos($CONTENT, '>', $pos1);
 $pos2 = strpos($CONTENT, $pose);


//On affiche l'intérieur du tag
echo "<p>Résultat 2 : " . substr ( $CONTENT , $pos1+strlen($posd) , $pos2-$pos1-strlen($posd) ) . "</p>";

?>

Donne ceci :

Le pseudo a été trouvé : [Dal]

Résultat 1 : img src="http://static.ccm2.net/www.commentcamarche.net/_skin/_local/img/logo.png?54344445544" alt="CommentCaMarche" />

Résultat 2 : 

Mon "code" n'est pas plus "compliqué" que le tien (il est même plus court et permet de tester si l'on a trouvé quelque chose ou pas).

Ce qui est moins évident, bien sûr, c'est de composer la bonne regexp pour le cas qui nous concerne. C'est juste une syntaxe à connaître.

#class="userName boxButton">\s+([^\s]+)\s+</a>#s

Signifie :
- cherche en considérant le contenu recherché comme une seule ligne (modificateur "s" pour "single")
- quelque chose comportant class="userName boxButton">
- avec un ou plusieurs blancs à la suite : \s+
- capture ensuite un ou plusieurs caractères à la suite qui ne sont pas des blancs : ([^\s]+)
- à la suite de cela il y a un ou plusieurs blancs : \s+
- à la suite de cela il y a </a>


Dal
Messages postés
15
Date d'inscription
mercredi 5 juin 2013
Statut
Membre
Dernière intervention
6 juin 2013
2
Je comprend regexp, mais quand j'ai commencé comme débutant je n'y comprenait rien et les code que je trouvait me rendais dépendent de solution fixe auquel j'étais incapable de modifier.

Alors selon moi il est toujours mieux de commencer en bas de l'échelle et comme sa devenir autonome.
Messages postés
5473
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
18 février 2021
925
Salut Franky do,

Oui, bien sûr, tu as raison de dire que l'on peut tenter d'utiliser strpos au lieu de preg_match si on ne comprend pas les regexp. Cela peut être, d'ailleurs, plus adapté dans certains cas, le fonctionnement de strpos étant sans doutes plus rapide que le moteur de regexp.

Même si ton code est limité et ne donne pas le résultat escompté sur l'exemple demandé, il a le mérite de donner une idée de comment cela peut être fait dans certains cas.

En ce qui concerne la regexp proposée, à la réflexion, je pense que la regexp ne peut pas ignorer les blancs entre les balises (du moins de façon simple), car les noms d'utilisateurs peuvent contenir des espaces, comme "Franky do".

Alors, en utilisant :

#class="userName boxButton">(.*?)</a>#s

on devrait simplement capturer le contenu de la balise.

Je pense que le savoir ne prend guère de place et qu'il y a des cas où on ne peut pas se passer des regexp. Si l'objectif de Rayfi est de pouvoir faire cela sur d'autres codes Html que celui de la page de CCM, et qu'il doit utiliser les regexp, il vaudra mieux qu'il apprenne.

Il faut commencer par quelque chose de simple. On peut utiliser des regexp et faire des choses simples avec, au départ, et ne complexifier que lorsqu'on a maîtrisé les choses simples et qu'on se rend compte que l'on veut (et peut) faire plus.

Pour commencer, il y a https://www.commentcamarche.net/contents/803-php-expressions-regulieres

et aussi https://www.google.fr/webhp?gws_rd=ssl

Utiliser quelque chose comme http://www.weitz.de/regex-coach/ pour les tester facilement et voir le résultat en temps réel de la regexp que l'on tape, ou utiliser l'un des nombreux sites en ligne qui permettent de tester des regexp.

C'est un outil génial (malheureusement aujourd'hui uniquement maintenu sous Windows). Si vous l'utilisez pensez à remercier l'auteur et encourager la continuation de son travail en lui faisant une donation.


Dal

Edit : correction de la regexp et de sa portée