Affichage resultats recherche type google

Contenu du snippet

Salut à tous !

Pour ma 1ere contribution sur PHPCS, je poste ici cette fonction que j'ai codée pour un besoin bien précis : afficher PROPREMENT (visuellement) des résultats de recherches en grand nombre.
L'idée est de s'inspirer de Google, qui, d'une part centre les phrases de ses résultats autour du mot clé recherché, mais en plus le met en gras, pour une visibilité optimale.
Par ex, pour une recherche sur "PHP", on aura :

----------------------------
PHPCS.com | PHP CodeS SourceS | 3011 sources PHP, Source, Code ...- 01:35
Beaucoup de Codes Sources pour (gras)PHP(/gras), Scripts, Script, Sources, Codes, France, Francais, French.
www.phpcs.com/
----------------------------

Bref, sur un texte de 1000 mots ou plus, comment faire pareil ? Ca semble simple au 1er abord, mais cela nécessite un peu de code, que voici...
J'ai réalisé ce code car je n'ai pas trouvé cette fonction sur ce site, ni sur le net ;)
Une parenthèse pour dire que mon code est optimisable, et d'ailleurs j'essaierai de le mettre à jour lorsque je ferai des modifs.

Source / Exemple :

function Aff_Search_Results($text, $mot, $LimMax, $LimDown, $ponct = "...")


{

				
		///////////// TRAITEMENT DU TEXTE /////////////////
				
				
		$chaine = htmlspecialchars_decode($text); // on commence à traiter le texte, en convertissant le code html
				
		$chaine = ereg_replace('<[^>]*>', ' ', $chaine); // On vire ensuite les balises html, mais on les remplace par un espace;
								// Au contraire, avec strip_tags, par ex pour un <li>, on aurait 2 mot colés
				
		$motNoUSe = strtolower($mot); // On met le terme de la recherche en minuscules afin de ne pas avoir de mauvaise surprise
				
		$chaineNoUse = strtolower($chaine); // On met la chaine au même niveau
				
				
				
		///////////// RECHERCHE DES TERMES /////////////////
				
		$pos = strpos($chaineNoUse, $motNoUSe, 1); // Donne la position du terme recherché, mais dans la chaine en minuscules
				
		$min = $pos - $LimDown; // NB limite pour la phrase à x caractères AVANT le mot recherché
				
				
		if ($min <= 0 ) // Si le mini est négatif, cela nous ferait partir de la fin; il faut donc le mettre à 0
				
		{ 
				
		$min = 0 ;
				
		}
				
				
		$chaine = substr($chaine, $min, $LimMax); // chaine temporaire coupée, mais peut etre au milieu d'un mot !
				
		$chaineNoUse = substr($chaineNoUse, $min, $LimMax); // Cette chaine est en minuscules, et nous servira UNIQUEMENT pour le calcul plus loin
				
				
				
		$espace = strrpos($chaine, ' '); // Repérage du dernier espace de la chaine tronquée
				
		$chaineFinale = substr($chaine, '0', $espace); // Chaine finale, retaillée un peu A LA FIN pour tomber sur un espace
				
				
		if ($min != 0) { // si on ne commence pas la phrase par le début de la chaine, car sinon on couperai le 1er mot !
				
		$chaineFinale = strstr($chaineFinale, ' '); // Traitement DU DEBUT de la chaine, pour tomber sur un espace
				
		}
			
				
				
		///////////// VERIF DE LA PHRASE /////////////////
				
				
		$long = strlen($chaineNoUse); 	// Longeur de la chaine après coupure; 
						//on part de la chaine non tronquée pour ne pas fausser le résultat ensuite
				
				
		$Ppos = strpos($chaineNoUse, $motNoUSe, 1); // Donne la position du mot dans la chaine finale
				
				
		$Mmax = $long - $Ppos; // On calcule ce qui reste après le mot recherché
				
				
				
				
		///////////// SURLIGNAGE DES TERMES /////////////////
				
		// Solution N#1 pour le surlignage du mot : c'est plus propre, MAIS ne surligne pas les termes contenus dans un mot 
		//(ex : le mot "orange" ne sera pas trouvé dans "orangeade"
		// A vous d'activer l'une ou l'autre selon votre besoin !!! ;)
		//$chaineFinale = preg_replace('#\b' .$mot. '\b#i', '<span class="surligne">\0</span>', $chaineFinale);
				
				
				
		// Solution #2, moins propre mais  qui correspond à ce que je veux faire ici !
		// Note : j'utilise ici str_ireplace car il est insensible à la casse
		// Par contre gros défaut : si le mot recherché est en minuscules, il sera affiché en minuscules dans le texte final
		// J'utilise donc un strtoupper afin qu'il soit tjs en majuscules, histoire d'améliorer la visibilité
				
		$motMaj = strtoupper($mot);
				
		$chaineFinale = str_ireplace($mot, '<span class="surligne">'.$motMaj.'</span>', $chaineFinale);// on situe le mot recherché dans le texte et on le surligne 
				 
				 
				 
				 
				
		///////////// AFFICHAGE DU RESULTAT /////////////////
				
		if ($Ppos < ($LimMax - $LimDown)) { // Si la partie AVANT le terme recherché est plus petite que le max autorisé
				
		print $chaineFinale.' '.$ponct; // Chaine sans mini
				
		} elseif ($Mmax < $LimDown) { // Même chose mais avec la partie APRES
				
		print $ponct.' '.$chaineFinale; // Chaine sans maxi
				
		} else { // Sinon on est au milieu d'un phrase, on met la ponctuation au début ET a la fin
				
		print $ponct.' '.$chaineFinale.' '.$ponct; // Chaine complete
				
		}
				

} // fin de la fonction

Conclusion :

En conclusion, sur un texte comme celui-ci (en anglais, dsl):

The LHC will produce head-on collisions between two beams of particles of the same kind, either protons or lead ions. The beams will be created in CERN’s existing chain of accelerators and then injected into the LHC, where they will travel through a vacuum comparable to outer space. Superconducting magnets operating at extremely low temperatures will guide the beams around the ring.
Each beam will consist of nearly 3000 bunches of particles and each bunch will contain as many as 100 billion particles. The particles are so tiny that the chance of any two colliding is very small. When the bunches cross, there will be only about 20 collisions among 200 billion particles. However, bunches will cross about 30 million times per second, so the LHC will generate up to 600 million collisions per second.

Avec le mot clé "guide", vous aurez ce type de résultats (limitation à env 300 mots):

... the LHC, where they will travel through a vacuum comparable to outer space. Superconducting magnets operating at extremely low temperatures will (surligné)GUIDE(/surligné) the beams around the ring. Each beam will consist of nearly 3000 bunches of particles and each bunch will contain as many as 100 ...

Voici un lien pour voir le résultat (tjs en anglais) : http://www.gridguide.org/search3.php
Autre lien incluant une recherche : http://www.gridguide.org/search.php?search1=egee&x=0&y=0

Enfin, remarque importante pour les débutants (si ca peut aider), pour vos recherches, pensez à sécurisez votre formulaire avec, au minimum "mysql_real_escape_string", contre les injections SQL.
Et pour la méthode de recherche, je vous conseille FULLTEXT...

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (mdc888fr)