begin process at 2010 02 10 04:10:02
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Chaîne de caratère

 > AFFICHAGE RESULTATS RECHERCHE TYPE GOOGLE

AFFICHAGE RESULTATS RECHERCHE TYPE GOOGLE


 Information sur la source

Note :
6 / 10 - par 2 personnes
6,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Chaîne de caratère Classé sous :Affichage recherche, Google, centrer phrase, surligner mot-clé, moteur recherche Niveau :Débutant Date de création :17/03/2009 Date de mise à jour :19/03/2009 16:18:41 Vu :2 829

Auteur : mdc888fr

Ecrire un message privé
Site perso
Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
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

  • 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
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&#8217;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...


 Historique

17 mars 2009 11:59:39 :
Lien vers un exemple
17 mars 2009 12:28:28 :
Autre exemple
17 mars 2009 16:33:04 :
Modif de présentation
19 mars 2009 16:18:41 :
Modif du lien exemple qui a changé

 Sources de la même categorie

Source avec Zip GÉNÉRER UN MOT DE PASS ALÉATOIRE par narkos2
UNICODE TO HTML ENTITIES par CrazyShooter
Source avec Zip DÉBUTANT : FONCTION POUR TRANSFORMER UN TEMPS EN SECONDES EN... par MonkeyIsBack
FONCTION QUI GÉNÈRE UN CODE GRÂCE À L'ORTOGRAPHE ET LA PRONO... par foofymany
Source avec Zip TRADUCTION DE FICHIERS DE LANGUE AVEC GOOGLE GTRANSLATE par madislak

 Sources en rapport avec celle ci

Source avec Zip TRADUCTION DE FICHIERS DE LANGUE AVEC GOOGLE GTRANSLATE par madislak
DERNIÈRES NOUVELLES DE LA GOOGLE HACKING DATABASE (GHDB) par pifol
Source avec Zip API GOOGLE ANALYTICS SUR VOTRE SITE par SebaZen
Source avec Zip Source avec une capture N/X API: GOOGLE MAPS DEPUIS PHP VALID W3C par GillesWebmaster
Source avec Zip UTILISER SES ALBUMS PHOTOS PICASA SUR SON SITE PERSO par RyoSensei

Commentaires et avis

Commentaire de rambc le 23/03/2009 09:32:33

Les navigateurs usuels proposent déjà ce type de choses. Non ? Pourquoi faire un tel code ?

Commentaire de LeFauve42 le 23/03/2009 09:59:30 6/10

>  Les navigateurs usuels proposent déjà ce type de choses.

Moi mon navigateur, il ne me propose aucun code :o)

Tu veux peut-etre parler des moteurs de recherche usuels.
Le probleme est qu'ils ne te permettent pas de faire des recherches sur tes propres donnees.

Ce type de code, meme si on a l'habitude d'en voir le resultat tous les jours sous google ou autres, reste non trivial a implementer proprement.

Merci pour ton code mdc888fr qui represente un bon point de depart, malgres quelques petits defauts (par exemple, je ne suis pas sur que ton code elimine correctement les tags <script> ou <style>).

Eric

Commentaire de mdc888fr le 23/03/2009 10:07:24

Salut Eric,

Oui, tu as tout à fait raison pour ton explication à RAMBC, merci de lui avoir si bien expliqué...
Par contre pour les balises, je l'ai pas mal testé, et normalement il vire tout. Néanmoins je peux me tromper, et bien sur je suis ouvert à toute optimisation ;)

Autre chose : j'ai (ou plutot un ami à moi) trouvé  une alternative MySQL à ce code; quelque chose comme :
SELECT LOCATE('motcle',champs) as pos ,
SUBSTRING(champs,GREATEST((motcle('science',champs)-64),1),160) as txt1 ,
SUBSTRING(champs,GREATEST((motcle('science',champs)-256),1),512) as txt2
FROM table WHERE id = '$id'

Je n'en suis qu'aux tests, et le gros problème pour l'instant est que je ne peux pas faire de recherche multi-champs.
Je posterai ici mes avancées, s'il y en a que ca intéresse ;) ;) ;)

Commentaire de LeFauve42 le 23/03/2009 11:19:53

Je peux me tromper, mais je pense que la ligne :
$chaine = ereg_replace('<[^>]*>', ' ', $chaine);

remplace :

<script type="...">alert("Hello!");</script>

par :

alert("Hello!");

Plus grave : Ca remplace le texte :

Cette formule fonctionne uniquement si x<=0. En effet, si x>0, ca plante

par :

Cette formule fonctionne uniquement si x 0, ca plante

C'est loin d'etre trivial comme je disais :o)

Bonne chance !

Commentaire de mdc888fr le 23/03/2009 11:35:51

Tout à fait véridique.
Il est vrai que pour les besoins du site que je suis en train de coder, cela fonctionne très bien car il n'y aura jamais de JS.
Mais je n'avais pas pensé à cette utilisation, il faut que je regarde ca.

Plus grave comme tu dis, dans le cas d'une formule mathématique, ca me bouffe des signes.
Pas bon du tout.
Je vais réfléchir à tout ca.
Une idée de ton coté ?

Merci !

Commentaire de mdc888fr le 23/03/2009 11:43:38

Petite précision : l'utilisation de strip_tags dans ce cas me colle le texte séparé par des balises; c'est pour cela que je ne l'ai pas utilisé.
Exemple :
liste de codes :
<u><li>Code 1</li>
<li>Code 2 </li></ul>

Me donne : "liste de codesCode 1Code 2"

Commentaire de LeFauve42 le 23/03/2009 14:16:24

D'un autre cote, il y a des cas ou ce n'est pas judicieux d'ajouter un expace, comme par exemple :
UNCLE = <b>U</b>nited <b>N</b>etwork <b>C</b>ommand for <b>L</b>aw and <b>E</b>nforcement

A mon avis, tu devrais traiter separement les <li> and co qui sont les seuls ou des espaces sont necessaires (a part peut-etre les divs), et utiliser strip-tags pour le reste.

Peut-etre aussi qu'appeler htmlspecialchars_decode() au debut n'est pas une bonne idee (si c'est un tag, les caracteres ne seront pas encodes).

Imagine une page qui decrit la syntaxe de HTML :o)

Commentaire de mdc888fr le 23/03/2009 14:24:18

Ouep, je rigole d'avance en imaginant une page décrivant une syntaxe HTML...  :)
Je crois que tu as raison, je vais créer une petite fonction de traitement, avec d'abord les <li> et ensuite un strip-tags.
De toutes façon, c'est le genre de truc qui sert tout le temps !

Je posterai une MAJ bientôt.

Commentaire de d54 le 23/03/2009 18:53:50

Bon code, mais pour plus de lisibilité, ajoute <?php au début et ?> à la fin (normalement, le code est coloré, dans ce cas).

Commentaire de PetitDoigt le 23/03/2009 19:58:50

L'idée est bonne ; l'initiative l'est encore plus. Mais comme tu dis toi-même, il y a une bonne possibilité d'optimiser...

Commentaire de griffondorr le 03/04/2009 11:28:30 6/10

pas mal mais a améliorer ;)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Url bizarre ou...? [ par MAsterC ] Salut à tous!J'aimerai avoir une explication sur le URL de Google...http://www.google.ca/search?q=googlePourquoi, le fichier "search" n php et google ... ? [ par michelvernet2 ] bonjour,pour éviter un PB de session avec aol, je force la session dans l'adresse, voir : www.nouveauxobjets.com . Pour ceux qui ont la google barre, referencement google et PHP [ par michelvernet2 ] bonjour,pour éviter un PB de session avec aol, je force la session dans l'adresse, voir : www.nouveauxobjets.com . Pour ceux qui ont la google barre, ouvir page [ par xa4ke ] voila je voulais savoir comment en php je pouvais metter en cliquant sur un lien par ex " google "que une nouvelle page s affiche a la place que l envoi de variables préfabriquées vers un script JS? [ par johanb ] bonjour &#224; tous,j'ai quelques probl&#234;mes &#224; faire communiquer php et javascript.je voudrais cr&#233;er un script semblable &#224; celui de Aidez moi je cherche à realiser un report avec l'adwords google api [ par amellouki ] Je desire realiser un report avec l'adwords google api avec toute les campagnes et leurs mots cl&#233;s. J'utilise nusoap et php.aidez moi!!!Si quelqu Google ? [ par deathshade ] est-il possible de faire une recher sur google avec notre propre formulaire (oui ! lolol)&nbsp; mais esse-que ont peut apres avoir fait notre recherch Google Print : OCR [ par GRenard ] Yo tout le monde, vous avez vu la sorti de google print ? (http://print.google.com) sorti hier (ou avant hier pour certains). Si vous regardez, vous p Google AdSense (réécriture) [ par motherboy ] Hello tout l'monde,J'ai un petit projet, qui me semble compliqu&#233; en PHP.J'aimerai donc, recup&#233;r&#233; le JavaScript de Google AdSense, et le problème moteur de recherche [ par tony4758 ] Bonjour, j'ai cr&#233;e un moeur de recherche tr&#232;s simple avec base de donn&#233;e. Voici la structure de ma base :CREATE TABLE sonarty_search (i


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,624 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales