Bonjour,

J'ai du mal à trouver la bonne regexp pour faire du highlighting, avec les contraintes suivantes :
- il peut avoir plusieurs mots à surligner
- il faut faire abstraction des caractères spéciaux de recherche (* & + ...)
- il faut que ça soit case insensitive
- il ne faut pas faire de replace dans les balises HTML

Pour le moment j'utilise en gros la fonction suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
function surligne($champ)
{
	// $_REQUEST['keywords'] est l'expression (on peut avoir plusieurs mots) que je recherche dans $champ
 
	$needles=explode(' ',urldecode($_REQUEST['keywords']));
	$res=$champ;
	foreach($needles as $needle)
	{
		$needle=trim($needle,'*-+"&|()<>~');
		$res=eregi_replace('(.*)('.$needle.')(.*)','\1<span class="surligne">\2</span>\3',$res);
	}
	return $res;
}
Le problème est que ça ne fait le replace que sur la dernière occurence d'un keyword dans mon champ !
Si je me trompe pas, ereg_replace doit normalement remplacer toutes les occurences.

Mon deuxième problèmes concerne les balises HTML et notamment les mailto.
Par exemple si je recherche "toto" dans <a href="mailto:toto@bob.com">Toto</a> , le replace va aussi se faire dans le mailto.
J'ai tenté d'utiliser une regexp de ce type :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
$champ=preg_replace("/(>|^)([^<]+)(?=<|$)/esx","'\\1'.str_replace('".$needle."','<span class=\"surligne\">".$needle."</span>','\\2')",$champ);
mais ce n'est pas très concluant.


Quelqu'un aurait-il une piste ??
Merci !