Extraire le contenu entre deux balises HTML
Résolu/Fermé
Rayfi
Messages postés
203
Date d'inscription
lundi 24 septembre 2012
Statut
Membre
Dernière intervention
28 juin 2017
-
4 juin 2013 à 15:10
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 6 juin 2013 à 11:52
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 6 juin 2013 à 11:52
A voir également:
- Regex récupérer contenu entre deux balises
- Recuperer video youtube - Guide
- Comment récupérer un compte facebook piraté - Guide
- Recuperer message whatsapp - Guide
- Deux comptes whatsapp - Guide
- Récupérer photo instagram - Guide
3 réponses
Rayfi
Messages postés
203
Date d'inscription
lundi 24 septembre 2012
Statut
Membre
Dernière intervention
28 juin 2017
30
5 juin 2013 à 14:56
5 juin 2013 à 14:56
up
[Dal]
Messages postés
6174
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
2 février 2024
1 083
5 juin 2013 à 15:57
5 juin 2013 à 15:57
Salut Rayfi,
Sur l'exemple du code de la page de ccm d'un utilisateur authentifié, tu peux faire comme cela :
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
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
Franky do
Messages postés
15
Date d'inscription
mercredi 5 juin 2013
Statut
Membre
Dernière intervention
6 juin 2013
2
Modifié par Franky do le 5/06/2013 à 16:52
Modifié par Franky do le 5/06/2013 à 16:52
Pour un tag simple
Si tu cherche a parti d'un indice :
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 !
//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 !
[Dal]
Messages postés
6174
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
2 février 2024
1 083
Modifié par [Dal] le 5/06/2013 à 18:07
Modifié par [Dal] le 5/06/2013 à 18:07
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) :
Donne ceci :
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.
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
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
Franky do
Messages postés
15
Date d'inscription
mercredi 5 juin 2013
Statut
Membre
Dernière intervention
6 juin 2013
2
5 juin 2013 à 18:22
5 juin 2013 à 18:22
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.
Alors selon moi il est toujours mieux de commencer en bas de l'échelle et comme sa devenir autonome.
[Dal]
Messages postés
6174
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
2 février 2024
1 083
Modifié par [Dal] le 6/06/2013 à 11:59
Modifié par [Dal] le 6/06/2013 à 11:59
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 :
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
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