Petit moteur de recherche en php ? Help me [Résolu/Fermé]

Signaler
-
 Greg -
Bonjour,
J'aimerais faire un moteur de recherche en php sur un seul fichier html. Par exemple, je veux rechercher le mot hello dans un fichier "bob.html" ou il y a plusieur mots hello. J'aimerais que le resultat s'affiche sous la forme suivante (Affichage du mot hello en couleur et affichage 2 lignes avant et 2 lignes apres), pour etre plus clair voici un exemple :

Resultat 1 :
blablabla
blablabla
blablabla hello blablabla
blablabla
blablabla
Resultat 2 :
blablabla
blablabla
blablabla hello blablabla
blablabla
blablabla
Resultat 3 :
blablabla
blablabla
blablabla hello blablabla
blablabla
blablabla

Je ne suis pas bon en php mais je crois qu'il faut utiliser les fonctions foreach et while. Si quelqu'un peut m'aider. Je lui en remercie d'avance.

14 réponses

Bonjour,


Je t'ai fait ça, ça marche chez moi.

<html>
<?php 
$mot="hello";
$nom_fichier="bob.html";
$array_fichier=file($nom_fichier);// met le fichier ligne par ligne dans l'array
//on parcour chaque ligne
$r=1;
foreach($array_fichier as $cle=>$value){
	if(strstr($value,$mot)){ // si on trouve le mot dans la ligne
		//titre souligne:
		echo "<br><u> Resultat ".$r."</u>:<br>";
		//dans la ligne on remplace le mot par la mise en forme HTML <font color.... et le mot
		$value_modifiee = str_replace($mot, "<font color='red'>".$mot."</font>", $value);
		echo $array_fichier[$cle-2]."<br>".$array_fichier[$cle-1]."<br>";// les deux lignes avant
		echo $value_modifiee."<br>";// la ligne avec le mot en rouge
		echo $array_fichier[$cle+1]."<br>".$array_fichier[$cle+2]."<br>";// les deux lignes après
		//on increment le numero de resultat
		$r++;
	}
}
?>
</html>

Bonjour,
Effectivement ça marche aussi chez moi. Et je t'en remercie. Mais il y a des petits erreur que je n'arrive pas à corriger. Par exemple dans mon fichier HTML, il y a un tableau et quand je lui demande de chercher un mot dans un tableau. Le résultat est vide. Et aussi je voudrais que mon moteur de recherche fasse pas la différence entre majuscule et miniscule. Par exemple si je lui demande de chercher le mot "hello", il peut trouver dans les resultats "Hello" ou "HEllo" ou "HELLO" .... Voila mais petit soucis si quelqu'un peut m'aider. Encore merci merci merci pour avoir pris de ton temps pour moi.
Bonjour,

pour le pb des majuscules minuscule, je t'ai réglé ça:

(il faut remplacer les str....() par des preg_......
dans
"#".$mot."#i"
, le i veut dire ne pas tenir compte de la casse;

voici le code:

<html>
<?php 
$mot="HEllo";
$nom_fichier="bob.html";
$array_fichier=file($nom_fichier);// met le fichier ligne par ligne dans l'array
//on parcour chaque ligne
$r=1;
foreach($array_fichier as $cle=>$value){
	if(preg_match("#".$mot."#i",$value)){ // si on trouve le mot dans la ligne
		//titre souligne:
		echo "<br><u> Resultat ".$r."</u>:<br>";
		//dans la ligne on remplace le mot par la mise en forme HTML <font color....
		$value_modifiee = preg_replace("#".$mot."#i", "<font color='red'>".$mot."</font>", $value);
		echo $array_fichier[$cle-2]."<br>".$array_fichier[$cle-1]."<br>";// les deux lignes avant
		echo $value_modifiee."<br>";// la ligne avec le mot en rouge
		echo $array_fichier[$cle+1]."<br>".$array_fichier[$cle+2]."<br>";// les deux lignes après
		//on increment le numero de resultat
		$r++;
	}
}
?>
</html>


Par contre pour ton pb de tableau je ne vois pas comment est fait ton fichier, donnes moi un bout d'exemple si tu peux.
Merci, tu es trop rapide :) encore merci

alors j'ai fais une copie de la partie tableau du code source de ma page html :

<table border=1 cellpadding=3>
<tr><td>Bob </td><td> pecheur</td>
<tr><td>Pierre </td><td> pompier</td>
<tr><td>Jacque <td> plombier</td>
<tr><td>Gael </td><td> chirurgien</td>

</table>

Donc par exemple, quand je tape Pierre, il met resultat 1 : (avec 5 lignes blanche)

Voila
Merci Merci Merci Merci
Re bonjour,

C'est les tags HTML qui gênaient

je t'ai fait un fichier un peu plus complet avec le form pour saisir le mot, une fonction qui supprime les tags html au moment du traitement
et de l'affichage.

j'ai aussi traité le cas ou c'est Pierre qui est écrit dans le fichier et que tu tapes pierre, on réaffiche bien Pierre avec une majuscule, tel qu'il était dans le fichier.

<html>
<form method="post" action="moteur_php.php">
	<input type="text" name="mot_rech" value="">
	<input type="submit" name="rechercher" value="Rechercher dans le fichier">
</form>
<br><br>
<?php
//fonction qui supprime les tags html , (je l'ai recuperee sur un site)
 function stripHTMLtags($texte){
	//On retire le code HTML
	$mots = explode("<",$texte);
	$texte = "";
	$nbmots = count($mots);
	 for ($m = 0; $m < $nbmots; $m++){
		 $mot = $mots[$m];
		 $finbalise = strpos($mot,">",0);
		 if ($finbalise > 0) {
			$mot = substr($mot,$finbalise+1);
		}
		$texte .= "$mot";
	 }
	return $texte;
} 
//fin fonction

///traitement
if(isset($_POST['rechercher'])){// si le formulaire a ete poste
	echo "La r&eacute;ponse:<br>";
	$mot=$_POST['mot_rech'];
	$nom_fichier="bob2.html";
	$array_fichier=file($nom_fichier);// met le fichier ligne par ligne dans l'array
	//on parcour chaque ligne
	$r=1;
	foreach($array_fichier as $cle=>$value){
		$value_sans_html=stripHTMLtags($value);
		if(preg_match("#".$mot."#i",$value_sans_html)){ // si on trouve le mot dans la ligne
			//titre souligne:
			echo "<br><u> Resultat ".$r."</u>:<br>";
			//dans la ligne on remplace le mot par la mise en forme HTML <font color....
			// on recherche d'abord le mot avec sa casse exacte dans le fichier, pour le réafficher tel qu'il est et pas tel qu'il a ete tape
			$rech_mot=preg_match("#".$mot."#i",$value_sans_html,$matches);
			$mot_exact_trouve=$matches[0];
			$value_modifiee = preg_replace("#".$mot."#i", "<font color='red'>".$mot_exact_trouve."</font>", $value_sans_html);
			echo stripHTMLtags($array_fichier[$cle-2])."<br>".stripHTMLtags($array_fichier[$cle-1])."<br>";// les deux lignes avant
			echo $value_modifiee."<br>";// la ligne avec le mot en rouge
			echo stripHTMLtags($array_fichier[$cle+1])."<br>".stripHTMLtags($array_fichier[$cle+2])."<br>";// les deux lignes après
			//on increment le numero de resultat
			$r++;
		}
	}
}
	?>
</html>


A toi de jouer !
Bonjour,

Si pb, change le nom du fichier dans:

$nom_fichier="bob2.html";


@lain
Bonjour,

Merci alain, je viens de le tester sur mon site et tout marche comme je le souhaitais. Un grand merci pour avoir pris de ton temps et aussi un grand merci pour avoir mis des commentaires qui m'ont beaucoup aider à comprendre. Je vais encore faire des tests pour voir si tout fonctionne parfaitement et je te tiendrais au courant.

MERCI !!!
Bonjour,

Je souhaiterais améliorer encore un peu mon moteur de recherche mais j'ai du mal. J'aimerais qu'une fois ma recherche réalisée, il y ait le nombre de resultat afficher (exemple : il y a 40 resultats du mot bob). Et aussi je comprend pas, je sais pas si c'est normal ou pas mais quand je tape mon mot dans la case et que je tape ensuite sur entrer, ça passe a la ligne en dessous et ça lance pas la recherche du mot (je sais pas si je suis clair) mais en gros pour faire une recherche je suis obligé de prendre la souris et cliquez sur le bouton Rechercher.

Merci,
Belle soirée
Salut Greg,

quand je tape mon mot dans la case et que je tape ensuite sur entrer, ça passe a la ligne en dessous et ça lance pas la recherche du mot

C'est normal, la touche entrée soumet bien le formulaire, mais dans mon code je teste que le bouton "Rechercher... " a bien été cliqué, je te modifie ça

une fois ma recherche réalisée, il y ait le nombre de resultat afficher
pas de pb je te fais ça, le résultat sera affiché à la fin, pour l'afficher avant la liste, c'est un peu plus compliqué

Voilà:

<html>
<form method="post" action="moteur_php.php">
	<input type="text" name="mot_rech" value="">
	<input type="submit" name="rechercher" value="Rechercher dans le fichier">
</form>
<br><br>
<?php
//fonction qui supprime les tags html , (je l'ai recuperee sur un site)
 function stripHTMLtags($texte){
	//On retire le code HTML
	$mots = explode("<",$texte);
	$texte = "";
	$nbmots = count($mots);
	 for ($m = 0; $m < $nbmots; $m++){
		 $mot = $mots[$m];
		 $finbalise = strpos($mot,">",0);
		 if ($finbalise > 0) {
			$mot = substr($mot,$finbalise+1);
		}
		$texte .= "$mot";
	 }
	return $texte;
} 
//fin fonction

///traitement
if(isset($_POST['rechercher']) || $_POST['mot_rech'] !=""){// si le formulaire a ete poste
	echo "La r&eacute;ponse:<br>";
	$mot=$_POST['mot_rech'];
	$nom_fichier="bob2.html";
	$array_fichier=file($nom_fichier);// met le fichier ligne par ligne dans l'array
	// i,itialisation des variables
	$r=1;
	$nb_trouves=0;
	//on parcourt chaque ligne
	foreach($array_fichier as $cle=>$value){
		$value_sans_html=stripHTMLtags($value);
		if(preg_match("#".$mot."#i",$value_sans_html)){ // si on trouve le mot dans la ligne
			$nb_trouves ++;  // on incremente le nb
			//titre souligne:
			echo "<br><u> Resultat ".$r."</u>:<br>";
			//dans la ligne on remplace le mot par la mise en forme HTML <font color....
			// on recherche d'abord le mot avec sa casse exacte dans le fichier, pour le réafficher tel qu'il est et pas tel qu'il a ete tape
			$rech_mot=preg_match("#".$mot."#i",$value_sans_html,$matches);
			$mot_exact_trouve=$matches[0];
			$value_modifiee = preg_replace("#".$mot."#i", "<font color='red'>".$mot_exact_trouve."</font>", $value_sans_html);
			echo stripHTMLtags($array_fichier[$cle-2])."<br>".stripHTMLtags($array_fichier[$cle-1])."<br>";// les deux lignes avant
			echo $value_modifiee."<br>";// la ligne avec le mot en rouge
			echo stripHTMLtags($array_fichier[$cle+1])."<br>".stripHTMLtags($array_fichier[$cle+2])."<br>";// les deux lignes après
			//on increment le numero de resultat
			$r++;
		}
	}
	echo "<br><br>Le mot <font color='red'><b>$mot</b></font> a &eacute;t&eacute; trouv&eacute <b>$nb_trouves</b> fois.";
}
	?>
</html>


@lain
bonjour alain,

J'ai toujours quelques difficultés en php. J'aimerais savoir si il était possible que tu me fournisses ton adresse email pour pouvoir communiquer directement via email au lieu de passer par ce forum. Merci

Cordialement
Bonsoir,

si je peux t'aider.

alain4208 arobase orange.fr

@lain
Bonsoir,

Apparament votre adresse ne fonction pas :(

Cordialement,
Greg
si elle fonctionne, il suffit de remplacer arobase par @

@lain
Bonjour,

Je ne comprend pas, je vous ai envoyé 3 mails sur cette adresse

alain4208 arobase orange.fr

en remplaçant bien le arobase par @

:(

je vous passe mon adresse : josepe38 arobase free.fr

Merci