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 :
Le problème est que ça ne fait le replace que sur la dernière occurence d'un keyword dans mon champ !
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; }
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 :
mais ce n'est pas très concluant.
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);
Quelqu'un aurait-il une piste ??
Merci !
Partager