Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/05/2011, 17h51   #1
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 65
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : décembre 2006
Messages : 65
Points : 14
Points : 14
Par défaut Problème de capture avec preg_match_all() dans un résultat de Curl

Bonjour à tous,

J'ai un problème pour capturer le contenu d'une balise issue d'une page récupérée avec Curl.

Code :
$content = recuperer_page_http($v['adr1'].$plus.$v['adr2'], 10,'','');
J'ai testé le retour de ma fonction "recuperer_page_http" qui utilise Curl et elle me retourne la page html passée en paramètre en un "string" contenant l'ensemble de la page

De cette page j'aimerais en extraire des données spécifiques, pour ça j'ai identifié des noms de classe de balise de la page qui entoure mon information.

Voici le patern que j'ai créé pour mon preg_match_all ce ui me permet de récupérer le contenu de la balise "dd" avec la classe "pdg_b_sm"

Code :
$content = preg_match_all("#<dd class=\"pdg_b_sm\">.*</dd>#",$content,$resultats,PREG_PATTERN_ORDER);
Puis je l'affiche comme cela pour voir les résultats :

Code :
1
2
3
foreach ($resultats[0] as $result) {
 print_r(htmlentities($result));// store each $result in database or create a new spider to spider next page
}
Résultat des courses, tout ce code m'affiche 20 fois (nombre d'occurences trouvé dans la page) le string "<dd class="pdg_b_sm"></dd>" Alors que ce que je veux isoler, c'est justement le contenu de cette balise.

Si vous pouvez m'apporter de l'aide en ce qui concerne mon problème ça serait sympa, j'ai appris les expressions régulières depuis peu et la fonction preg_match_all() aussi, mais ça fait 2 jours que je m'arrache les cheveux. Pourtant je suis certain de ne pas être loin de la solution...

Merci d'avance
vgross est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 18h00   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
pour parser du HTML c'est DOMDocument
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/05/2011, 18h29   #3
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 65
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : décembre 2006
Messages : 65
Points : 14
Points : 14
J'ai déjà vu une réponse similaire de toi dans d'autres topics concernant ce sujet et j'ai commencé à lire la doc PHP sur DOMDocument mais je suis sur un projet de site "comparatif de prix" et j'aurai besoin de faire cette extraction sur plusieurs sites à la fois après la requète d'un utilisateur...

DOMDucument ne serait pas trop lourd niveau ressource pour mon besoin ?

Je ne suis pas contre changé de techno pour mon projet mais mes preg_match me semblait plus léger...

Après je me trompe peut être...
vgross est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 18h36   #4
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
DOMDocument est plus simple a utiliser et a comprendre que les regex, de plus que c'est fait pour ça
Pour la requete Xpath ca donnera : //dd[@class="pdg_b_sm"]

essaye aussi de voir, si ton site ne propose pas une API
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 23h43   #5
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 65
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : décembre 2006
Messages : 65
Points : 14
Points : 14
Les sites que je veux "scanner" ne propose pas d'API il s'agit d'un marché trop petit et les sites ne sont pas vraiment évolués.

Je vais suivre ton conseil, je vais commenté tous mes preg_match pour le moment et je vais me lancer dans DOMDocument (j'ai quand même appris toute la syntaxe des expression régulière POSIX et PCRE pour rien mais bon, ça pourra toujours servir je me suis fait des fiches récapitulatives ^^)

Merci pour le Xpath de ma requête mais je vais quand même être obligé de la déchiffrer et d'en comprendre la syntaxe sinon ça sert à rien... je crois que j'ai une nouvelle syntaxe à apprendre !

En tout cas merci pour tes réponses rapides !
vgross est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 16h44   #6
Membre régulier
 
Homme
Étudiant
Inscription : juin 2011
Messages : 55
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Val d'Oise (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : juin 2011
Messages : 55
Points : 77
Points : 77
Premièrement, pour isoler l’intérieur, mets des parenthèses autour de ton .* ce qui donne
Code :
"#<dd class=\"pdg_b_sm\">(.*)</dd>#"
Deuxièmement, je rajouterai un ? apres ton .* pour bien spécifier que tu ne veux qu'une seule balise
Code :
<dd> : "#<dd class=\"pdg_b_sm\">(.*?)</dd>#"
Troisièmement, cela ne fonctionnera malheureusement pas si tu as des balises <dd> imbriquées les unes dans les autres telles que
Code :
<dd class=\"pdg_b_sm\"><dd class=\"pdg_b_sm\">bla-bla</dd></dd>
Si tu connais la strucuture de ton site j'imagine que mon troisièmement ne te pose aucun problème ^^

sinon pour répondre à ta question... a moins qu'il y ai 20 fois
Code :
"<dd class="pdg_b_sm"></dd>"
dans la page il y a effectivement un problème, sauf bien sur si ces balises ne contiennent que du code html et que ce code soit interprété sur la page de visualisation .

Teste déjà avec (.*?) et dis nous si ca change vraiment quelque chose.
Avalion est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h47.


 
 
 
 
Partenaires

Hébergement Web