Indexer une page html

Indexer une page html - PHP - Programmation

Marsh Posté le 21-09-2007 à 14:53:57    

Bonjour à tous,
VOilà je suis confronter à un problème que je n'arrive pas a résoudre...
Je dois mettre dans une base de donné le contenu d'une page HTML afin d'utiliser son contenu comme mots clés pour mon moteur de recherche ?
j'utilise les commandes suivantes :

Code :
  1. $handle = @fopen("./dossier/fichier.htm", "r" );
  2. if ($handle)
  3. {
  4.     while (!feof($handle))
  5.     {
  6.       $buffer = fgets($handle, 4096);
  7.       //echo $buffer;
  8.       $indexation .= strip_tags($buffer);
  9.     }
  10.     fclose($handle);
  11. }
  12. $word = explode(" ",$indexation);


Seulement voilà, je voulais ne récuprer que les mots de plus de 3 caractères donc j'ai rajouté cette commande :
 
if (strlen($word[$i]) > 4) ... blabla
 
Et je m'aperçois qu'en plus de tout ca il m'affiche bcp de chose inutile comme des caractères spéciaux ... et des chiffres ...
 
Existe-t-il un moyen simple de ne récuprer que les mots de > 3 caractères et de ne pas prendre les signes speciaux et chiffres ...
 
Merci de votre aide.

Reply

Marsh Posté le 21-09-2007 à 14:53:57   

Reply

Marsh Posté le 21-09-2007 à 16:01:19    

Les signes spéciaux comme tu dis, c'est surement les caractères autres que a à z sans les accents qui sont encodés correctement avec les codes html de ces entités.
 
Faut les traduire à la volée pour avoir la version lisible par toi même. Ou faire avec :spamafote:

Reply

Marsh Posté le 21-09-2007 à 18:43:11    

Tu peux utiliser html_entity_decode() pour convertir les codes HTML en caractères 'normaux'.
 
Niveaux accents, il faut faire super attention à l'encodage de ce que tu vas parser, ça peut changer du tout au tout!
 
Tu peux aussi choisir de restreindre tout ce qui n'est pas lettres simples en autre chose, comme le dit leflos5

Reply

Marsh Posté le 21-09-2007 à 18:46:55    

J'ai trouve une solution mais bon...
DAns le test je fais  

Code :
  1. if (strlen($word[$i]) > 4 && !eregi("[:punct:]+[:digit:]",$word[i])) {

... j'incremente la valeur finale et donc je prend en compte le mot testé ...
Ca marche mais je connais pas trop bien cette commande eregi et je voudrais rajouter en test le fait que je ne souhaite pas non plus prendre les caractères ":<>/\@&-_..." Enfin en gros je ne veux que les caractères a-z c'est tout ;)
 
Merci d'avance

Reply

Marsh Posté le 21-09-2007 à 18:51:56    

oups, j'avais pas bien vu déjà une GROSSE erreur dans ton code
 
Tu lis par bloc de 4ko et tu fais les traitements en direct. Donc si une balise commence avant la fin des 4ko et termine après, tu te bouffes plein de saloperies.
 
Il faut faire ton strip_tags une fois TOUT le fichier lu, ça devrait déjà calmer les choses (sans toutefois tout régler) ;)

Reply

Marsh Posté le 21-09-2007 à 19:30:23    

edwoud a écrit :

oups, j'avais pas bien vu déjà une GROSSE erreur dans ton code
 
Tu lis par bloc de 4ko et tu fais les traitements en direct. Donc si une balise commence avant la fin des 4ko et termine après, tu te bouffes plein de saloperies.
 
Il faut faire ton strip_tags une fois TOUT le fichier lu, ça devrait déjà calmer les choses (sans toutefois tout régler) ;)


Objection ! [:nahouto]
 
Voir la doc de fgets à ce sujet : http://fr3.php.net/fgets . Si une nouvelle ligne se présente avant la fin du buffer, cette nouvelle ligne est alors retournée. Il est vrai cependant que le plus propre reste un fgets($handle) sans longueur maximum.


---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
Reply

Marsh Posté le 21-09-2007 à 19:31:52    

Odissine a écrit :

J'ai trouve une solution mais bon...
DAns le test je fais  

Code :
  1. if (strlen($word[$i]) > 4 && !eregi("[:punct:]+[:digit:]",$word[i])) {

... j'incremente la valeur finale et donc je prend en compte le mot testé ...
Ca marche mais je connais pas trop bien cette commande eregi et je voudrais rajouter en test le fait que je ne souhaite pas non plus prendre les caractères ":<>/\@&-_..." Enfin en gros je ne veux que les caractères a-z c'est tout ;)
 
Merci d'avance


Pour des lettres de A à Z :
 
preg_match('#[a-z0-9]{0,}#i',$word[i]);


---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
Reply

Marsh Posté le 21-09-2007 à 19:54:31    

WiiDS a écrit :


Objection ! [:nahouto]


 
Objection rejetée! On peut éclater ses balises sur plusieurs lignes ;)
 

Code :
  1. <img src="youplaboum.jpg"
  2. alt="youpi">


 

Reply

Marsh Posté le 21-09-2007 à 20:59:22    

edwoud a écrit :


 
Objection rejetée! On peut éclater ses balises sur plusieurs lignes ;)
 

Code :
  1. <img src="youplaboum.jpg"
  2. alt="youpi">


 


Objection ! [:nahouto]
 
Rien ne prouve qu'il aie éclaté ses balises sur plusieurs lignes [:thalis]


---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
Reply

Marsh Posté le 22-09-2007 à 01:44:57    

Ok merci à tous mais je pense que ma demande n'est pas très claire ^^
 
Je me reprends:
J'ai des pages html (ou php) dans un repertoire (./procedures/), j'ai crée un menu qui affiche dans un menu déroulant la liste des documents présent dans le dit repertoire.
Ce que je souhaite c'est en choisissant un documents, ne recuperer dans son contenu QUE les mots de + de 4 caractères. ex :  
<html><head><body>Ceci est un test tout simple dans lequel je ne souhaite récuperer que les mots supérieurs à 4 caractères<br>1) c'est simple je pense<br>2) je sais pas comment faire autrement</body></head></html>
Dans ce petit bout de code, je ne voudrais récuperer que les mots, afin de les ajouter dans un base de données et les associer au fichier html en question. C'est à dire je ne veux que "ceci, tout, simple, dans, lequel, souhaite, récuperer, mots, supérieur, caractères,...
Ceci dans le but de faire un moteur de recherche avec les documents que j'ai indéxer avec cette méthode.
 
Existe-t-il un moyen simple et rapide pour faire cette "indexation" ? La fonction strip_tags($variable) permet de supprimer justement les balises HTML (ca ca marche) en revanche j'ai encore un problème avec les ponctuations du type { } < > ] [ - ... je ne voudrais vraiment que des chaines de caractères de 4 caract. ou plus.
 
Merci de votre aide.
 
Cordialement

Reply

Marsh Posté le 22-09-2007 à 01:44:57   

Reply

Marsh Posté le 22-09-2007 à 02:40:27    

avec ton exemple ca m'a pris une petite minute grand max...
tu t'es pas creusé la tête  
 
ps : le bbcode foire les backslashes : y en a un devant le w et le n dans le str_replace

Code :
  1. <?php
  2. $var = "<html><head><body>Ceci est un test tout simple dans lequel je ne souhaite récuperer que les mots supérieurs à 4 caractères<br>1) c'est simple je pense<br>2) je sais pas comment faire autrement</body></head></html>";
  3. //pour gérer correctement les retour de ligne
  4. $var = strip_tags(str_replace(array('<br>','<br />'),"n",$var));
  5. preg_match_all('#(w{4,}+)#',$var,$out);
  6. echo '<pre>';print_r($out[1]);echo '</pre>';
  7. ?>


Message édité par Profil supprimé le 22-09-2007 à 02:44:01
Reply

Marsh Posté le 22-09-2007 à 09:06:38    

WiiDS a écrit :


Objection ! [:nahouto]
Rien ne prouve qu'il aie éclaté ses balises sur plusieurs lignes [:thalis]


 
Objection rejetée, quand on récupère un fichier HTML, il ne faut supposer de rien, sinon c'est la cata assurée! Et puis ce n'est pas propre. Quand bien même ce serait le cas actuellement, vu que c'est pour un moteur propriétaire de recherche. Si un jour il change la génération du fichier HTML, badaboum, tout part en vrille. Il faut programmer propre dès le début, ça ne coûte pas grand chose et ça ouvre à toutes les évolutions!

Reply

Marsh Posté le 22-09-2007 à 11:07:53    

Merci Spike, je vais tester tout ca Lundi.
Je me suis pris la tête mais malheureusement mes connaissances en PHP datent un peu et étant comme beaucoup autodidactent j'ai pris surement de mauvaise habitudes, ce qui m'explique aujourd'hui mon appel à l'aide ;)
 
Merci en tout cas à tous !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed