Précédent   Forum des professionnels en informatique > PHP > Scripts
Scripts Forum d'entraide sur les scripts PHP téléchargés. Les meilleurs scripts PHP, la FAQ scripts PHP, toutes les FAQ PHP
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 04/07/2006, 17h17   #1
Membre confirmé
 
Inscription : février 2006
Messages : 487
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 487
Points : 200
Points : 200
Par défaut [PHP] Parser d'une page HTML pour récupération du texte

Bonjour,

Je souhaiterais à partir d'un fichier HTML, extraire tout le texte qui existe sur la page. Est-ce qu il y a des algos, des fonctions que vous me conseillez pour faire cela?

A titre d'exemeple, si j'ai :
Code :
1
2
3
4
 
<head>
<title> mon site </title></head>
<body> ok </body>
Et après, mettre dans un fichier :
mon site
ok

Je pensais essayer de détecter tous les textes entre "> < ". Est-ce une bonne idée?
trihanhcie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2006, 17h30   #2
Membre confirmé
 
Inscription : février 2006
Messages : 487
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 487
Points : 200
Points : 200
Il semblerait que la meilleure solution soit d'utiliser les expressions régulières avec preg_match?

Quelqu'un peut me confirmer ca? faut que je regarde cmt s'utilise cette fonction
trihanhcie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2006, 17h54   #3
Membre éclairé
 
Inscription : janvier 2004
Messages : 419
Détails du profil
Informations personnelles :
Âge : 39
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2004
Messages : 419
Points : 305
Points : 305
Sinon, tu as tidy, si l'extension est installée sur ton serveur :

http://fr2.php.net/manual/fr/function.tidy-get-body.php
zevince est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2006, 18h09   #4
Membre confirmé
 
Inscription : février 2006
Messages : 487
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 487
Points : 200
Points : 200
Non elle ne l'est pas

J'ai une question sur l'utilisation des expression regulières la...
Code :
1
2
3
4
5
6
7
8
9
10
11
 
$filehandle=fopen('index.html','r');
 
while(!feof($filehandle))
{
  $line.=fgets($filehandle, 500); // Max 500 chars
 
}
  $titre = eregi("<title>(.*)</title>",$line,$regs);
 
echo $regs[0];
Je pensais que ca le résultat allait être le contenu du titre sans les balises mais ce n'est pas le cas.. comment on peut récupérer juste ce qu il y a entre les balises<title> et </title> avec une expression régulière?

merci
trihanhcie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2006, 10h03   #5
Membre confirmé
 
Inscription : février 2006
Messages : 487
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 487
Points : 200
Points : 200
Bonjour,

mmm j'ai du mal avec les expressions régulières :s

Code :
1
2
3
4
 
<META NAME="description" CONTENT="Publicit&eacute; on line, Bases de donn&eacute;es, commerce &eacute;lectronique ? Adverland : un interlocuteur unique pour mon&eacute;tiser votre audience">
<META NAME="keywords"  CONTENT="r&eacute;seau,publicit&eacute;,campagne publicitaire,CPM,campagnes,annonceur,annonceurs,editeurs,&eacute;diteurs, publicitaires,rentabilisez,rentabiliser,rentabilise,publicit&eacute; on line,bases de donn&eacute;es,commerce &eacute;lectronique,audience,r&eacute;gie, online,publicite, marketing,emailing,e-mailing, wap, banniere,bannière,affiliation,reseau,regie,CB ,carte bleue,sms,sms+,wh,w-ha,audiotel,micropaiement">
<META NAME="classification"  CONTENT="REGIE PUBLICITAIRE,MARKETING,COMMERCE ELECTRONIQUE,AFFILIATION">
je souhaiterais récupérer ce qu'il y a après le content, entre les guillemets
j'ai donc essayé :
Code :
eregi("<META NAME=\"description\"(.*)CONTENT=\"(.*)>(\n\r)$",$line,$metadesc);
pour description par exemple mais marche pas tres bien

Si je retire le \n\r$ je récupère plus d'une ligne :s

Je continue de regarder mais si quelqu'un peut m'aider

Merci
trihanhcie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2006, 11h26   #6
Membre confirmé
 
Inscription : février 2006
Messages : 487
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 487
Points : 200
Points : 200
J'ai plus ou moins résolu le problème des metas en supposant qu'une page est bien écrite c'est à dire que c'est de la forme
Code :
1
2
3
 
<Meta name = ...>
<Meta Name = >
Mon problème vient maintenant du texte dans le body... Ce que je faisais pour les métas, c'est de tester en lisant le fichier avec file() mais la je ne pourrai pas dans le body...

Je suis, il me semble, obligé de garder tout ce qu il y a entre <body> et </body>

Ensuite, j'aurai bien voulu, dans un premier temps, repéré ce qui se trouve entre <td...>texte</td>

J'ai donc fait :
Code :
eregi("<td(.*)>(.*)(</td>?)",$text,$regtext);
Je voulais qu'il me récupère que la première fermeture du td... Or la, je récupère tout jusqu au dernier </td> de ma page... Je me suis trompé qq part dans l'expression je suppose

Merci!
trihanhcie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2006, 12h47   #7
Expert Confirmé
 
Avatar de Maxoo
 
Maxime Pasquier
Expert PHP
Inscription : novembre 2004
Messages : 2 127
Détails du profil
Informations personnelles :
Nom : Maxime Pasquier
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Expert PHP
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2004
Messages : 2 127
Points : 2 603
Points : 2 603
Code :
preg_match_all("#<td[^>]*>(.*)</td>#Ui",$texte,$resultat);
Voila !! il vaut mieux utiliser les PCRE (donc preg_) que les ereg_
__________________
Pour une bien meilleur lisibilité, utilisez la balise [code], c'est le [#] dans votre éditeur.
Mon espace Développez : mes Créations.


Rencontre & Carte des Membres de Developpez.com, version 3.0
Maxoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2006, 15h02   #8
Membre confirmé
 
Inscription : février 2006
Messages : 487
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 487
Points : 200
Points : 200
Merci

J'ai changé mon fusil d'épaule entre temps en fait

Je vais récupérer tout ce qu il y a entre les '>' et '<'
Code :
1
2
 
/* if(preg_match_all('|>[^<]+<|i',$text,$matches))*/
qui se trouve entre <body> et </body>
mais bon j'ai l'impression que j'ai un petit prob :d
Code :
if(preg_match_all('|<body[^>]*>[^</body>]*</body>|i',$text,$matches));
trihanhcie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2006, 15h18   #9
Expert Confirmé
 
Avatar de Maxoo
 
Maxime Pasquier
Expert PHP
Inscription : novembre 2004
Messages : 2 127
Détails du profil
Informations personnelles :
Nom : Maxime Pasquier
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Expert PHP
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2004
Messages : 2 127
Points : 2 603
Points : 2 603
Code :
preg_match_all('#<body[^>]*>.*</body>#i',$text,$matches);
le ^ c est pour un seul caractere. et sinon je sais pas si c est super a utiliser dans un if.
__________________
Pour une bien meilleur lisibilité, utilisez la balise [code], c'est le [#] dans votre éditeur.
Mon espace Développez : mes Créations.


Rencontre & Carte des Membres de Developpez.com, version 3.0
Maxoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2006, 15h38   #10
Membre confirmé
 
Inscription : février 2006
Messages : 487
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 487
Points : 200
Points : 200
oui c'est vrai que le if pas tres utile pour le moment

Merci pour le ^

Question... Ca existe un preg_match_all insensible à la casse? Parce que je suppose que si un site mais <BODY> a la place de <body> mon script va pas apprécié :s
trihanhcie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2006, 15h57   #11
Expert Confirmé
 
Avatar de Maxoo
 
Maxime Pasquier
Expert PHP
Inscription : novembre 2004
Messages : 2 127
Détails du profil
Informations personnelles :
Nom : Maxime Pasquier
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Expert PHP
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2004
Messages : 2 127
Points : 2 603
Points : 2 603
ca donne insensible à la casse ...

et sinon pour connaitre les autres : http://fr.php.net/manual/fr/referenc....modifiers.php

Voila !!
__________________
Pour une bien meilleur lisibilité, utilisez la balise [code], c'est le [#] dans votre éditeur.
Mon espace Développez : mes Créations.


Rencontre & Carte des Membres de Developpez.com, version 3.0
Maxoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2006, 16h17   #12
Membre confirmé
 
Inscription : février 2006
Messages : 487
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 487
Points : 200
Points : 200
Merci

Heu ... mm comment dire, petit soucis ... je récupère beaucoup trop d'espace .

c'est à dire que j'ai des choses comme :

mon texte texte2

il y a une fonction qui supprime les espaces en trop ? ou je dois l écrire moi meme :s
trihanhcie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2006, 16h19   #13
Expert Confirmé
 
Avatar de Maxoo
 
Maxime Pasquier
Expert PHP
Inscription : novembre 2004
Messages : 2 127
Détails du profil
Informations personnelles :
Nom : Maxime Pasquier
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Expert PHP
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2004
Messages : 2 127
Points : 2 603
Points : 2 603
trim()
__________________
Pour une bien meilleur lisibilité, utilisez la balise [code], c'est le [#] dans votre éditeur.
Mon espace Développez : mes Créations.


Rencontre & Carte des Membres de Developpez.com, version 3.0
Maxoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2006, 16h23   #14
Membre confirmé
 
Inscription : février 2006
Messages : 487
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 487
Points : 200
Points : 200
Merci maître Maxoo
trihanhcie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2006, 10h37   #15
Membre régulier
 
Avatar de ikeaboy
 
Inscription : novembre 2004
Messages : 114
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : novembre 2004
Messages : 114
Points : 80
Points : 80
Citation:
Envoyé par Maxoo
Code :
preg_match_all('#<body[^>]*>.*</body>#i',$text,$matches);
le ^ c est pour un seul caractere. et sinon je sais pas si c est super a utiliser dans un if.
Bonjour,

Ici $text représente quoi? c'est bien le chemin du fichier non?

Faut il encore utiliser le code d'ouverture la ?

Code :
1
2
3
4
5
6
7
8
9
10
11
 
$filehandle=fopen('index.html','r');
 
while(!feof($filehandle))
{
  $line.=fgets($filehandle, 500); // Max 500 chars
 
}
  $titre = eregi("<title>(.*)</title>",$line,$regs);
 
echo $regs[0];
Merci pour les renseignements
ikeaboy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2006, 10h59   #16
Expert Confirmé
 
Avatar de Maxoo
 
Maxime Pasquier
Expert PHP
Inscription : novembre 2004
Messages : 2 127
Détails du profil
Informations personnelles :
Nom : Maxime Pasquier
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Expert PHP
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2004
Messages : 2 127
Points : 2 603
Points : 2 603
Bien sur il faut que tu ouvres quand meme ton fichier,
tu récuperes tout dans $line, tu passes le regexp sur $line, et apres tu vois dans $matches ou se cachent les bon résultats ...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
$filehandle=fopen('index.html','r');
$line = "";

while(!feof($filehandle))
{
  $line.=fgets($filehandle, 500); // Max 500 chars

}

preg_match_all('#<body[^>]*>.*</body>#i',$line,$matches);

print_r($matches);;
__________________
Pour une bien meilleur lisibilité, utilisez la balise [code], c'est le [#] dans votre éditeur.
Mon espace Développez : mes Créations.


Rencontre & Carte des Membres de Developpez.com, version 3.0
Maxoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2006, 11h11   #17
Membre régulier
 
Avatar de ikeaboy
 
Inscription : novembre 2004
Messages : 114
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : novembre 2004
Messages : 114
Points : 80
Points : 80
oui en effet ca fonctionne bien
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
//Ouverture du fichier
						$line="";	
						$filehandle=fopen($filename,'r');
 
								while(!feof($filehandle))
								{
  									$line.=fgets($filehandle,500); // Max 500 chars
 
								}
 
 
						preg_match_all('#<span[^>]*>.*</span>#i',$line,$matches);
 
							foreach ($matches as $val){
								echo $val[0]."<br/>";
								echo $val[1]."<br/>";
								echo $val[2]."<br/>";
								echo $val[3]."<br/>";
								echo $val[4]."<br/>";
							}
J'ai ajouté l'inisalisation de $line

EDIT : je n avais pas vu ton message je corrige mon initialisation

EDIT2 : très pratique le print_r on voit la position dans le tableau c'est très pratique

Merci
ikeaboy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2006, 11h34   #18
Expert Confirmé
 
Avatar de Maxoo
 
Maxime Pasquier
Expert PHP
Inscription : novembre 2004
Messages : 2 127
Détails du profil
Informations personnelles :
Nom : Maxime Pasquier
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Expert PHP
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2004
Messages : 2 127
Points : 2 603
Points : 2 603
sujet résolu ?
__________________
Pour une bien meilleur lisibilité, utilisez la balise [code], c'est le [#] dans votre éditeur.
Mon espace Développez : mes Créations.


Rencontre & Carte des Membres de Developpez.com, version 3.0
Maxoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2006, 13h35   #19
Membre régulier
 
Avatar de ikeaboy
 
Inscription : novembre 2004
Messages : 114
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : novembre 2004
Messages : 114
Points : 80
Points : 80
Oui résolu merci

Désolè j avais oublié
ikeaboy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2011, 15h30   #20
Membre chevronné
 
Avatar de hornetbzz
 
Homme
Directeur commercial
Inscription : octobre 2009
Messages : 474
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 44
Localisation : France

Informations professionnelles :
Activité : Directeur commercial

Informations forums :
Inscription : octobre 2009
Messages : 474
Points : 681
Points : 681
Envoyer un message via Skype™ à hornetbzz
Désolé si je réveille un peu les morts, mais ce message m'a intéressé, donc je complète, ou plutôt j'actualise :

Il n'est pas nécessaire de parser le fichier ligne à ligne, mais on peut simplement utiliser la fonction file_get_contents, par exemple :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Charger le fichier dans une variable
// NB: penser à remettre pointeur à zéro si nécessaire
$load_response = file_get_contents(CURL_RESPONSE);
 
// Optionnel: Conversion des fins de ligne dos2unix
$html_contents = preg_replace('/(\r\n|\r|\n)/s',"\n",$load_response);
$html_contents = trim($html_contents);
 
// Et voila les patterns que vous pouvez tester - à adapter selon votre cas de figure
$patterns= array('#.*(foo.*=.*);.*#i',
			"#[\s]{0,}([\w\.]{0,}[\s]?bar.*=.*);.*#i"
		);
 
foreach ( $patterns as $pattern) {
	preg_match_all($pattern,  $html_contents, $matches);
	echo "<b>PATTERN $pattern</b>";
	echo '<pre>'; print_r($matches); echo '</pre>';
}
Le principe à adapter aux besoins de chacun bien sûr.

Et à noter qu'il existe maintenant de bons parsers HTML (exemple $html = new DOMDocument(); ).

Voila.
hornetbzz est dé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 +1. Il est actuellement 20h58.


 
 
 
 
Partenaires

Hébergement Web