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


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

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.