Recherche par mots clefs - découpage d'une phrase en mots - recherche et coloration des mots d'un texte

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 650 fois - Téléchargée 26 fois


Contenu du snippet

Bonjour,

Cette petite source a deux objectifs :
1. Evidemment, faire part à la "communauté" de mes travaux, afin que d'autre puisse le réultiliser sans avoir à réinventer la roue (comme je l'ai fait ici)
2. Vous demander de tester un peu les deux pauvres fonctions présentées ici. J'arrive enfin à la fin d'un projet... Il rentre en phase de test grandeur nature

Bon, rentrons dans le vif du sujet :

Ici, je vous présentes deux petites fonctions de mon cru. Elles sont ridicules, ridicules, riduculements petites. Mais pourtant tellement efficace.
On a

mots()
=> Découpe un phrase en mots pour ensuite utiliser ces mots dans une requète SQL
Exemple de découpage (je met le texte entre crichets) :
  • mots('salut') => array(0=>'salut');
  • mots('salut les gars'); => array(0=>'salut', 1=>'les', 2=>'gars);
  • mots('salut "les zounes"'); => array(0=>'salut',1=>'les zounes');
  • mots("et l'apostrophe ?"); => array(0=>'et',1=>'l\'apostrophe',2=>'?');

Bon, vous avez compris le principe ? (expressions exacte entre "" et on echappe pas ce qui sort de cette fonction)

colorer()
=> colore un texte selon une liste de mots
Je ne peux vous montrer un exemple ici. La source en dira plus...
Par contre :
  • cette fonction necessite 'mots()'
  • Elle est censé fonctionner avec les alphabets latin, nordique, allemand, espagnol... Bref toute l'UE (peut-être même le grec moderne, pas testé)


Je vous laisse voir le code

Source / Exemple :


/* 

  • On commence par la plus facile des deux : mots()
*
  • prend :
  • - @string $phrase // la phrase, à découper
*
  • retourne :
  • - array( int=>string ) // liste de tous les mots issue de la phrase. Tableau non-assiociatif, commence à zéro
  • /
function mots($phrase) { // strpslashes ? => je ne veux pas que cette chaine soit échappée... // '@["][^"]+["]|[\S^"]+@' => règle de découpage. Tout ce qui n'est pas un caractère blanc est bon à prendre preg_match_all('@["][^"]+["]|[\S^"]+@', stripslashes($phrase), $m); // La regle prend les ", donc les enlevés une fois que c'est découpé $m = str_replace('"', '', $m[0]); // Je ré-échappe les mots de la phrase. Cela viend du fait que j'utilise toujours des chaînes échappée. // Enlevez cette manip si c'est pas votre truc foreach( $m as $k=>$v ) { $m[$k] = addslashes($v); } // BINGO (juste on évite les mots en double) return array_unique($m); } /*
  • Le gros morceau : colorer()
*
  • prend :
  • - string/array $mots => quoi colorer? Cela peut-être une chaine (qui passera par la moulinette de mots()) ou directement un tableau de chaines
  • - string/array $texte => qui colorer? Un texte (multiligne ok) ou un tableau ASSOCIATIF OU NON de chaines à colorer
  • - (optionel) regexp $avoid => la coloration est dangeureuse ! (lien URL, identifiant...) On peut eviter la coloration de certain champs de $texte (si $texte est un tableau). Pour cela, former une expression régulière qui devra TROUVER LES CLEFS du tableau A NE PAS COLORER
*
  • retourne :
  • - string/array => le $texte colorer :) réultat selon le format de $texte en entré
*
  • NOTE IMPORTANTE :
  • La coloration se fait par l'insertion de balise <em></em> dans le texte !!!
  • à vous de jouer avec les styles (CSS) pour que la coloration soit belle.
  • (j'aurais pu mettre un 4ème paramètre pour choisir la balise... C'est facile à faire !
  • Un consiel, utilisez des balises courtes !)
  • BUG POSSIBLE :
  • Si je colore les mots A et EM dans 'Youpla!'
  • Je risque d'avoir 'Youpl<<em>e</em>m>a</<em>e</em>m>!'
  • Mais bizarement, je n'ai encore jamais croisé ce bug !!??!!
  • /
function colorer( $mots, $texte, $avoid=false ) { // les accents... c'est le gros problème et la raison de cette fonction $r = array(); // liste des caractères susseptibles d'être des accents $s = array(); // et leurs conditions de recherche particulières $r[] = '@([^ao])[EÈÉÊËeèéêë]@'; $s[] = '\1[EÈÉÊËeèéêë]'; //e $r[] = '@[CcÇç]@'; $s[] = '[CcÇç]'; //c $r[] = '@[IÌÍÎÏiìíîï]@'; $s[] = '[IÌÍÎÏiìíîï]'; //i $r[] = '@[DÐdð]@'; $s[] = '[DÐdð]'; //d $r[] = '@[NÑnñ]@'; $s[] = '[NÑnñ]'; //n $r[] = '@[UÙÚÛÜuùúû]@'; $s[] = '[UÙÚÛÜuùúû]'; //u $r[] = '@[YÝyýýýý]@'; $s[] = '[YÝyýýýý]'; //y $r[] = '@[BÞbþ]@'; $s[] = '[BÞbþ]'; //b $r[] = '@[Ssß]@'; $s[] = '[Ssß]'; //s $r[] = '@[AÀÁÂÃÄÅaàáâãäåæ]|ae@';$s[] = '([AÀÁÂÃÄÅaàáâãäåæ]|ae)';//a $r[] = '@[OÒÓÔÕÖoòóôõöø?]|oe@'; $s[] = '([OÒÓÔÕÖoòóôõöø?]|oe)'; //o // pour les deux derniers : faire gaffe au voyelles liées (vive le français ;) // on sauve les champs à ne pas colorer $sav = array(); if( $avoid!==false and is_array($texte) ) { foreach($texte as $k=>$v) { if( preg_match($avoid,$k) ) { $sav[$k] = $v; } } } // si les mots ne sont pas découpés, on les passes par la moulinette 'mots();' if( !is_array($mots) ) $mots = mots($mots); // Tout est là !!! // On remplace les lettres possiblement accentuées par leur règle de recherche respectives $mots = preg_replace($r, $s, $mots); // Construction de la big regexp de coloration $mots = implode('|', $mots); // Coloration ? C'est ici... $texte = preg_replace("@$mots@im", '<em>\0</em>', $texte); // Puis on restaure les champs sauvés foreach( $sav as $k=>$v ) { $texte[$k] = $v; } // BINGO return $texte; }

Conclusion :


Voilà...

J'espère que cela va vous aider...

J'attends aussi un maximum de commentaire afin que je puisse blinder ces fonctions, qui sont étonnemment petites (enfin je trouve)

A venir dans prochain les jours : mon moteur AJAX.
Vous allez voir, ça dépotte !

PS : j'ai l'impression que les tabultaions ne seront pa bien alignées... Désolé d'avance

A voir également

Ajouter un commentaire

Commentaires

Messages postés
11
Date d'inscription
vendredi 9 mars 2007
Statut
Membre
Dernière intervention
29 janvier 2010

salut
se sont de tres bon codes que tu a la
je cherche a modifier un ficher en cherchant des mots clef que je veux
ces mots seront stoké dans un tableau
tout ce que j'en ai besoin c'est :'comment parcourir une chaine de caracteres et stoké les mots delimiter par des caractere speciaux comme < et > dans un tableau '
par la suite j'utiliserai ma fonction qui est comme suit

function replaceChaine($Texte,$Tchamps,$Ttaille){
/*
$text =>le texte ou on fera la reherce
$Tchamps => tableau des carracteres a modifier
$Ttaille => la taille de tableau contenant les elements a modifier
*/
for($i=0;$i<$Ttaille;$i++){
$champs=$Tchamps[$i];//la chaine a remplacer
$Texte = ereg_replace($champs,"\\0",$Texte);
}//end for
echo"$Texte";
}//end function
Messages postés
4
Date d'inscription
lundi 8 mars 2004
Statut
Membre
Dernière intervention
8 octobre 2007

Bonjour, je ne sais pas si je m'y prend mal ou quoi mais chez moi le résultat est plutôt décevant.
Visuellement la coloration marche très bien mais lorsque je regarde le code html généré, c'est un peu plus délicat.
Pour un tableau de mot passé en paramètres :
var $mon_array = array('/flash/', '/2D/','/illustration/', Animations Flash/');
$mots_cles_color ="2D";

j'execute la fonction comme ceci :

$mots_cles = colorer($mots_cles_color, $mon_array);

et je récupère le résultat html suivant : (j'ai changé la source en modifiant le par un

flash, 2D, illustration, Animations Flash

Est-ce bien normal ? Je crois que seul le mot "2D" dois être entouré par le mais je ne vois pas d'ou viens l'erreur...

Merci de votre aide.

brex
Messages postés
144
Date d'inscription
jeudi 24 avril 2003
Statut
Membre
Dernière intervention
1 septembre 2008

Ok merci beaucoup a+
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
7
POUR L'AFFICHAGE DE L'EXEMPLE :
Faites comme ça (et en plus ce sera plus joli) :

/*---------------- remplacement -----------------*/
echo 'Résultat de la recherche :';
echo '';
$i=1;
while( $d = mysql_fetch_assoc($res) ) {
echo \"Resultat {$i++}
\n\";
$d = colorer($m, $d, '@Id|pouet@');
foreach( $d as $k=>$v ) echo \" * $k : $v\n";
}
echo '
';
/*----------- fin du remplacement ----------------*/
Messages postés
144
Date d'inscription
jeudi 24 avril 2003
Statut
Membre
Dernière intervention
1 septembre 2008

Désolé, mais effectivement j'ai changer ta ligne
//echo str_replace('',' ',nl2br(print_r($d, true)));
par
echo str_replace('',' ',nl2br(print($d)));
car j'avais ce message d'erreur Warning: Wrong parameter count for print_r()
Afficher les 13 commentaires

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.