Re: [PHP] Highlighter certains termes dans une chaîne

Salut,

Je cherche à mettre en évidence les termes recherchés, dans le résultat d'une recherche.

En gros, là où:

Code:
echo $var;

me donnerait ça:

Ici sont les résultats de ma recherche

je souhaite afficher, pour une recherche sur "recherche":

Ici sont les résultats de ma recherche

J'ai essayé de faire ceci:

Code:
<style>
.highlight { color:#FF0000 }
</style>

function Highlight ($chaine,$term) {
$chaine=eregi_replace('$term','<span class="highlight">$term\</span>',$chaine);
return ($chaine);
}

echo Highlight ($var,$term);

...mais je n'obtiens aucun changement.

Quelqu'un a une idée ? (c'est probablement au niveau de la fonction que ça déconne... je suis pas encore afficionado de fonctions php) ;)

Merci !
 
Salut,

tu peux faire ça autrement :

$var = str_replace($term, '<span class="highlight">'.$term.'</span>', $var);
 
Si tu veux utiliser absolument ta fonction...
Code:
function Highlight ($chaine,$term) { 
$chaine=eregi_replace($term,'<span class="highlight">'.$term.'</span>',$chaine); 
return ($chaine); 
} 

echo Highlight ($var,$term);
 
Bon, j'ai voulu pousser plus avant...

avec la fonction ci-desus, je cherche non plus à mettre en évidence $term dans $chaine, mais le contenu de explode(' ',$term);...

Ouais, j'suis ch**** ;)

imaginons que $data est "isoler%20certains%20caractères%20dans%20un%20span"
...et que...
$chaine est certains de ces caractères sont à isoler

(le résultat devrait être: certains de ces caractères sont à isoler)


Je l'éclate et j'en fais une array de chaque terme identifié par un espace...

Code:
$data = urldecode($data);
$subdata = explode(" ", $data);

-> ('isoler','certains','caractères','dans','un','span')

J'essaye avec le code suivant:

Code:
function Highlight ($chaine,$data) {
	$data = urldecode($data);
	$subdata = explode(" ", $data);
	$nb_subdata = sizeof($subdata);

for($highlight_run=0; $highlight_run<$nb_subdata; $highlight_run++)
	{
	$chaine=eregi_replace($subdata[$highlight_run],'<span class="highlight">'.$subdata[$highlight_run].'</span>',$chaine);
	}
return ($chaine);
}

Le problème est évidemment que comme je fais un eregi_replace d'un eregi_replace, autant de fois que de termes recherchés, il me considère aussi "span" comme à remplacer par <span class="highlight">span</span>, et j'ai donc à l'écran un résultat foireux qui m'affiche des spans de spans de spans du spam de mon span...

y'a t'il un moyen de faire remplacer dans une chaine chaque contenu d'une array ( donc autant "1" que "2" dans array('1','2')) par <span>1</span> pour "1" et <span>2</span> pour "2")?

Je sais pas si tout le monde me suit...

Merci d'avance... Après j'ai fini... ;)
 
Je ne suis pas sur d'avoir bien compris mais en remplacant
$nb_subdata = sizeof($subdata);
par
$nb_subdata = sizeof($subdata)-1;

ca doit etre mieux
 
$nb_subdata ne sert qu'à compter le nombre de termes différents dans l'array, pour après faire tourner autant de "highligh_runs" (et donc de eregi_replace) que de $subdata...

je pense pas que le problème soit là...

en gros je voudrais pouvoir faire un truc du genre (ce code est faux):

Code:
$chaine = "12345";
$data = array('1','3');
eregi_replace ($array,<span class="red">$array</span>,$chaine);

soit pour une chaine 12345
afficher à l'écrant 12345

'tain ça me les casse :(
 
J'ai testé ta fonction en local en mettant le "-1" et j'obtiens:
certains de ces caractères sont à isoler
avec un code source:
<span class="highlight">certains</span> de ces <span class="highlight">caractères</span> sont à <span class="highlight">isoler</span>
 
certes, parceque dans $data, "span" est le dernier $subdata, donc il ne fait pas le replace de "span"...

essaye avec $data = "isoler%20certains%20caractères%20dans%20un%20span%20%marche%pas" ;)

sachant que le problème apparaît avec tout caractère ou groupe de caractères qui apparaît dans "<span class="highlight">" ou "</span>"

donc si je fais une recherche sur "bric a brac" il va me faire une chiée de <sp<span="highlight">a</span>n="highlight">bric</span> <sp<span="highlight">a</span>n="highlight> <sp<span="highlight">a</span>n="highlight">br<span="highlight">a</span>c</sp<span="highlight">a</span>n>
 
je suis pas un féru d'expressions régulières, mais HawkEye_TpfH m'a mp alors bon ...

je pense que en faisant des or (|) tu devrait pouvoir y arriver.

Code:
$str = eregi_replace("terme1|terme2|terme3", $str);

donc, il suffirait, avant, d'ajouter un str_replace des espaces en |
mais je te conseille également de supprimer les termes de moins de deux ou trois caractères ;)
 
arf... pas d'bol c'est pas ton truc :(

j'ai essayé ça:

Code:
function Highlight ($chaine,$data) {
	$data = urldecode($data);
	$subdata = explode(" ", $data);
	$subdata = eregi_replace(" ","|",$subdata);
	$nb_subdata = sizeof($subdata);
$chaine = eregi_replace($subdata,'<span class="highlight">'.$subdata.'</span>',$chaine);
return ($chaine);
}

mais ça me donne aucun résultat ($chaine s'affiche normalement quoi...)

Bon... j'vais me coucher on verra demain...
 
Avec la technologie parpaing ca doit etre bon:
Code:
function Highlight ($chaine,$data) { 
   $data = urldecode($data); 
   $subdata = explode(" ", $data); 
   $nb_subdata = sizeof($subdata); 
for($highlight_run=0; $highlight_run<$nb_subdata; $highlight_run++) 
   { 
   $chaine=eregi_replace($subdata[$highlight_run],'|||'.$subdata[$highlight_run].'~~~',$chaine); 
   } 
   $chaine = str_replace (array("|||","~~~"), array("<span class=\"highlight\">","</span>"),$chaine);
return ($chaine); 
}
 
ROFLMAO...

Bon, on ne le criera pas trop fort, mais Vive la techologie parpaing !

Il reste une faille, lorsqu'une recherche est faite incluant "|" ou "~"; mais la faille n'est que "graphique", donc ça passe pour l'instant ;)

Merci mumbly !
 
haha :D
la curiosité etait trop grande.
Code:
function Highlight ($chaine,$data) {
   $data = urldecode($data);
   //$subdata = explode(" ", $data);
   $subdata = eregi_replace(" ","|",$data);
   $nb_subdata = sizeof($subdata);

	$chaine = preg_replace("#(".$subdata.")#","<span class=\"highlight\">$1</span>",$chaine);
	return ($chaine);
}

comme cela, et avec les valeurs dans la page :
Code:
$chaine = "pouet hello world hola";
$data = "pouet hola";

echo Highlight($chaine,$data);
ca fonctionne :)
 
Bravo KaZhaR!
C'est autre chose que la technologie parpaing ^^

En tout cas il faut que je retienne ce coups la
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut