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

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] preg_replace: mot recherché doit être en dehors de 2 balises

Re: preg_replace: mot recherché doit être en dehors de 2 bal

par bigs38 » 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';

Re: preg_replace: mot recherché doit être en dehors de 2 bal

par Saian » 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);
}

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

par bigs38 » 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.