[RESOLU] preg_replace: mot recherché doit être en dehors de 2 balises

Petit nouveau ! | 2 Messages

29 nov. 2012, 01:20

Bonjour,
depuis plusieurs jours je travail sur un moteur de recherche php mysql qui me souffle les mots lors de la frappe et qui me change la couleur des mots recherchés dans les resultats.
Malgrès pas mal de recherches sur le web je n'ai pas réussi à adapter les differents exemples que j'ai trouvé à mon script (je débute....)
La fonction qui permet ce changement de couleur est :

Code : Tout sélectionner

function highlight($resultat, $recherche) { $mots = explode(' ',$recherche); foreach($mots as $mot) { if ($mot != "") { $resultat = preg_replace("/$mot/i", "<font color=\"yellow\"><b>\\0</b></font>", $resultat); } } return $resultat; }
exemple :
$recherche = "vive"
$resultat = "vive les expression régulières"

ça nous donne <font color=yellow><b>vive</b></font> les expressions régulières

jusque là tout fonctionne très bien.

Maintenant si l'on continu de taper dans la zone de recherche "vive l" nous allons utiliser deux fois de suite la fonction preg_replace (boucle foreach)
une fois pour "vive" et une deuxième fois pour "l" le problème est que la fonction preg_replace va trouver le "l" dans le mot yellow lors de la deuxième boucle et va modifier le contenu de ma balise.

Je voudrais donc juste savoir si il est possible d'utiliser une expression régulière avec la variable $mot de telle sorte que seul ce qui se trouve en dehors de <font ........</font> soit traité (dans l'exemple le mot "vive" etant déjà traité).

En vous remerciant pour votre aide.

Avatar du membre
Mammouth du PHP | 1609 Messages

29 nov. 2012, 14:29

Le but du jeu est de faire tous les remplacements en un seul appel de preg_replace. Il faut donc modifier le pattern afin qu'il puisse faire le replace pour tous les mots :
$pattern = '/('.str_replace(' ', '|', $recherche).')/i';
et le preg_replace (sans foreach) :
$resultat = preg_replace($pattern, '<span style="color: yellow; font-weight: bold;">$1</span>', $resultat);
Ce qui nous donne :
function highlight($resultat, $recherche)
{
  $pattern = '/('.str_replace(' ', '|', $recherche).')/i';
  return preg_replace($pattern, '<span style="color: yellow; font-weight: bold;">$1</span>', $resultat);
}
Développeur web depuis + de 20 ans

Petit nouveau ! | 2 Messages

30 nov. 2012, 02:01

Merci mille fois Saian pour le code, c'est exactement ce que je voulais, et en plus c'est d'une simplicité .....
Pour ceux que ça interesse j'ai ajouté des "\b", car dans mon cas je voulais que le résultat concorde avec ma requête sql :

chaine de recherche : "mot1 mot2"
requête : select * from table1 where prenom like mot1% or prenom like mot2%
$chaine = "\b".$chaine; 
$pattern = '#('.str_replace(' ', '|\b', $chaine).')#i';