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 12/08/2011, 16h03   #1
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
Par défaut Capturer les 3 premiers paragraphes d'une page HTML

Bonjour à tous,

Et bien tout est dans le titre : à l'aide de file_get_contents(), je parse une page html et je voudrais récupérer le texte contenu dans les 3 premiers paragraphes, c'est à dire entre <p> et </p>.

J'ai bidouillé un truc avec preg_match_all, mais c'est pourri.
Est-ce au moins la bonne fonction ?
Merci de vos lumières.
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/08/2011, 16h47   #2
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 986
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 986
Points : 5 015
Points : 5 015
Non et tu devrais faire comme suit:
Code :
1
2
3
4
5
6
7
8
 
$doc = new DOMDocument;
$doc->load('http://mon.site.com/ma/page');
 
$list = $doc->getElementsByTagName('p');
for ($i = 0; $i < 3; $i ++) {
  echo $list->item($i)->nodeValue;
}
On ne le répétera jamais assez: arrêtez de parser du HTML avec des Regexp !
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/08/2011, 18h51   #3
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
Merci ! Je ne connaissais pas cette classe.
Bonne soirée.
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 11h05   #4
Membre du Club
 
Homme Boris
conception et traitement de documents xhtml
Inscription : août 2011
Messages : 107
Détails du profil
Informations personnelles :
Nom : Homme Boris
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : conception et traitement de documents xhtml
Secteur : Conseil

Informations forums :
Inscription : août 2011
Messages : 107
Points : 59
Points : 59
Citation:
Envoyé par Benjamin Delespierre Voir le message
On ne le répétera jamais assez: arrêtez de parser du HTML avec des Regexp !
Certes,

Mais je bloque sur le simple besoin suivant :

Je veux, si possible en simplexml ou en xpath, connaître le contenu du ième paragraphe d'un div que je ne connais que par son identificateur (je ne connais a priori pas sa place dans le fichier xhtml).

Comment donc je peux sélectionner le paragraphe 3 ? (Pour l'instant, je contourne la difficulté en utilisant une regex.)

<div id="Id_du_div">
xxx<p>Paragraphe 1</p>
xxx<p>Paragraphe 2</p>
xxx<p>Paragraphe 3</p> <----
xxx<p>Paragraphe 4</p>
</div>

Merci d'avance
Doc_xhtml est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 11h46   #5
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 986
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 986
Points : 5 015
Points : 5 015
Citation:
Envoyé par Doc_xhtml Voir le message
Comment donc je peux sélectionner le paragraphe 3 ? (Pour l'instant, je contourne la difficulté en utilisant une regex.)

<div id="Id_du_div">
xxx<p>Paragraphe 1</p>
xxx<p>Paragraphe 2</p>
xxx<p>Paragraphe 3</p> <----
xxx<p>Paragraphe 4</p>
</div>

Merci d'avance
Exactement de la même façon que cité plus haut. Tu réccupère une instance de DOMNodeList avec un XPAth ou DOMDocument::getElementsByTagName et tu peux accéder au node <n> avec DOMNodeList::item.

Merci de lire la doc
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 13h13   #6
Membre du Club
 
Homme Boris
conception et traitement de documents xhtml
Inscription : août 2011
Messages : 107
Détails du profil
Informations personnelles :
Nom : Homme Boris
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : conception et traitement de documents xhtml
Secteur : Conseil

Informations forums :
Inscription : août 2011
Messages : 107
Points : 59
Points : 59
Merci de ta réponse, Benjamin

Justement, si je pose la question, c'est que j'en ai pas explicitement trouvé la réponse dans la doc et que j'ai passé un temps plus que certain (une bonne partie de ce week-end) à essayer de comprendre pourquoi je récupérais des messages de type « Undefined property » ou «Trying to get property of non-object », alors que je m'inspirais au plus près possible des exemples donnés dans les docs et que j'avais l'impression d'avoir bien compris le principe.
Dans les docs, c'est toujours plus simple...

J'ai donc provisoirement abandonné et ai conservé mes regex.


J'ai cependant essayé de nouveau en me basant sur tes indications :

Code :
1
2
3
4
 
$doc = new DomDocument();
$doc -> loadHTMLFile($input_file_name);
$essai = $doc -> getElementByID('Main_parameters') -> getElementsByTagName('p') -> item(0) -> nodeValue;
J'obtiens bien le contenu du p. Merci !

Attention : item(0) et non item[0] ; si j'utilise les [] j'obtiens pour la ligne $essai = les deux messages suivants :
Citation:
Notice: Undefined property: DOMNodeList::$item in
Notice: Trying to get property of non-object in
(Je me mélange un peu les pinceaux entre la syntaxe de xpath et celle de dom.)


Maintenant, je vais (ré)essayer d'écrire la même expression en simplexml, d'une part, et en xpath, d'autre part. Pouvez-vous m'apporter quelques indications ? Merci d'avance
Doc_xhtml est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 13h31   #7
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 986
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 986
Points : 5 015
Points : 5 015
SimpleXML je pratique peu (je ne l'ai utilisé qu'une fois pour le coupler avec des RecursiveTreeIterator, ce qui est 'achement pratique car les classes DOM ne sont ni itérables ni traversables la plupart du temps).

Pour comprendre la syntaxe des XPath tu peux regarder les Cours XPath

Pour comprends comment utiliser les XPath en PHP, je te renvoie à la doc: http://php.net/manual/en/class.domxpath.php
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 09h31   #8
Membre du Club
 
Homme Boris
conception et traitement de documents xhtml
Inscription : août 2011
Messages : 107
Détails du profil
Informations personnelles :
Nom : Homme Boris
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : conception et traitement de documents xhtml
Secteur : Conseil

Informations forums :
Inscription : août 2011
Messages : 107
Points : 59
Points : 59
Bonjour Benjamin,

Excuse-moi de ne pas t'avoir répondu rapidement (je suis actuellement très pris sur mon projet que je dois terminer au plus tôt).

Merci pour les indications, notamment en ce qui concerne les cours Xpath. Ces cours représentent indéniablement du bon travail. (Je connaissais déjà l'article "Gestion du XML en PHP 5 : utiliser DOM" de Guillaume Piolle.).

J'ai imprimés ces articles et les étudierai lorsque j'aurai terminé mon projet actuel (je pourrai alors chercher à optimiser mon code afin d'éviter des regex inutiles dans les cas où l'utilisation de Xpath entraîne réellement une simplification de l'écriture).
J'espère que ces articles m'apporteront la réponse aux difficultés que j'ai rencontrées et qui m'ont rebuté, en particulier lorsque je me heurtais à des messages qui ne m'éclairaient pas ou à des affichages de noeud vides, alors que je suivais exactement les exemples présentés dans les docs.

Par ailleurs, il me semble, dans l'état actuel de ma pratique de DOM, de simplexml et de Xpath, que le débat regex versus outils d'analyse de document mérite de ne pas être systématisé : quelquefois l'utilisation d'une regex peut faciliter la tâche ; quelquefois, au contraire, l'utilisation de dom, simplexml ou de xpath peut permettre une analyse plus simple et plus immédiate.

Je traiterai du sujet (regex vs outils de parsing) dans un prochain post, lorsque j'aurai suffisamment assimilé et pratiqué concrètement sur mon projet les trois techniques.
Doc_xhtml est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 11h09   #9
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 986
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 986
Points : 5 015
Points : 5 015
Tu verra vite combien XPath est plus puissant que les regexp pour la manipulation XML à tout point de vue.

Si tu veux vraiment aller jusqu'au bout de ton apprentissage, je te recommande de te former également sur les DTD (Document Type Definition) et les XSL(T) (XML Style Sheet (Transformer)).
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 13h54   #10
Membre du Club
 
Homme Boris
conception et traitement de documents xhtml
Inscription : août 2011
Messages : 107
Détails du profil
Informations personnelles :
Nom : Homme Boris
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : conception et traitement de documents xhtml
Secteur : Conseil

Informations forums :
Inscription : août 2011
Messages : 107
Points : 59
Points : 59
Merci de ta réponse et de tes conseils.

Pour l'instant, je travaille exclusivement avec des documents xhtml-css (d'où mon pseudo ).

Je me repose donc sur la DTD de W3C, même si quelquefois je la trouve un peu limitative. (En même temps, cela aide à rester sur des rails rigoureux et homogènes ; je m'en contente donc.)

Pour la même raison (docs en xhtml-css), XSL-T et XLST-FO ne me sont pour l'instant pas nécessaires. (Je compte privilégier d'autres axes d'apprentissage, notamment dom, simplexml et Xpath, et bien sûr, l'approfondissement des très nombreuses possibilités de php.)
Doc_xhtml est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 15h24   #11
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 986
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 986
Points : 5 015
Points : 5 015
Citation:
Envoyé par Doc_xhtml Voir le message
Je me repose donc sur la DTD de W3C, même si quelquefois je la trouve un peu limitative. (En même temps, cela aide à rester sur des rails rigoureux et homogènes ; je m'en contente donc.)
XHTML 1.0 Strict, y'a que ça de vrai
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/08/2011, 08h38   #12
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
Bonjour,

Je me permet de remonter ce post, car je fais des tests avec la classe donnée par Benjamin, mais j'ai le souci suivant :

avec :
Code :
1
2
 
$list = $doc->getElementsByTagName('p');
Le tableau ne "ramasse" pas ce genre de paragraphe :

Code :
1
2
 
<p align="center"><img src="images/toto.gif" /></p>
Il les saute. Pourquoi ?
Code mal formé ?
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 09h31   #13
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 986
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 986
Points : 5 015
Points : 5 015
L'attribut align est illégal en XHTML mais je ne suis pas sûr que ce soit ça qui empêche de grepper les paragraphes...
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 09h39   #14
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
Euh, je précise que je parse le contenu d'une BDD, chargé avec :

Code :
1
2
 
$doc->loadHTML(stripslashes($content));
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 09h52   #15
Modérateur
 
Inscription : septembre 2010
Messages : 7 119
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 119
Points : 8 468
Points : 8 468
pourquoi stripslashes ta inséré tes données sans enlevé les magic_quote ?
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 10h48   #16
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
j'ai inséré mes données avec mysql_real_escape_string mais stripslashes ou pas, ça ne change rien, les images ne sont pas prises en compte.
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 10h59   #17
Modérateur
 
Inscription : septembre 2010
Messages : 7 119
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 119
Points : 8 468
Points : 8 468
montre la vrai valeur de $content
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h38.


 
 
 
 
Partenaires

Hébergement Web