Problème particulier avec Preg_replace

WRInaute discret
Bonjour, je ne suis pas un spécialiste de Preg_replace et je rencontre quelques problèmes avec cette fonction php.

Voilà mon cas :
J'ai un tableau de chaines en minuscules qui peuvent être composées de un où plusieurs mots.
Code:
$nbOcc=4;
$tab[1]='mot1';
$tab[2]='mot2 mot3';
$tab[3]='mot3;
$tab[4]='mot4';
J'ai un texte contenant les mots du tableau cité avant.

$string='bla bla blabla blabla Mot1 blabla blabla blabla mot2 mot3 blabla blabla blabla blabla Mot4 blabla blabla blabla blabla blabla bla mot4';

Dans ce texte les mots peuvent être en majuscules contrairement à ceux du tableau qui ne sont qu'en minuscules (je précise l'histoire des majuscules et minuscules juste pour justifier l'utilisation de preg_replace et non str_ireplace car au final je veux garder les majuscules du texte s'il y en avait, après remplacement. Mais ce n'est pas là le problème)

Je voudrais donc remplacer dans le texte les mots (du tableau) par des url pour que celà donne :

$string='bla bla blabla blabla <a href="http://url.com/Mot1">Mot1</a> blabla blabla blabla <a href="http://url.com/mot2+mot3">mot2 mot3</a> blabla blabla blabla blabla <a href="http://url.com/Mot4">Mot4</a> blabla blabla blabla blabla blabla bla <a href="http://url.com/mot4">mot4</a>';

J'ai testé deux solutions (voir le code ci-dessous) qui ont visiblement le même effet. Elles fonctionnent bien sauf pour le cas de $tab[2] et $tab[3] où la chaine 'mot3' est contenue dans les deux éléments du tableau. Je présume qu'il remplace deux fois la chaine 'mot2 mot3' de mon texte à cause de $tab[2] et $tab[3] ce qui fout une grosse pagaille.
Si l'ordre de $tab[2] et $tab[3] doit changer je voudrais que le texte ne soit changé qu'une seule fois et donc que je me retrouve soit avec :

$string='bla bla blabla blabla <a href="http://url.com/Mot1">Mot1</a> blabla blabla blabla <a href="http://url.com/mot2+mot3">mot2 mot3</a> blabla blabla blabla blabla <a href="http://url.com/Mot4">Mot4</a> blabla blabla blabla blabla blabla bla <a href="http://url.com/mot4">mot4</a>';

soit :

$string='bla bla blabla blabla <a href="http://url.com/Mot1">Mot1</a> blabla blabla blabla mot2 <a href="http://url.com/mot3">mot3</a> blabla blabla blabla blabla <a href="http://url.com/Mot4">Mot4</a> blabla blabla blabla blabla blabla bla <a href="http://url.com/mot4">mot4</a>';


Voilà les deux fonctions utilisées (...et qui ne marchent pas pour mon cas :( )
Code:
for ($i=1; $i<=$nbOcc; $i++)
   {$pattern = '/( '.$tab[$i].' )/i';
   $string = '<a href="http://url.com/'.$tab[$i].'" >$1</a>';
   $string=preg_replace($pattern, $replacement, $string);
   }
Code:
$pattern = array();
$replacement = array();              
for ($i=1; $i<=$nbOcc; $i++)
   {$pattern[$i]='/('.$tab[$i].')/i';
   $replacement[$i] = '<a href="http://url.com/'.$tab[$i].'" >$1</a>';                                                              
   }
$string=preg_replace($pattern, $replacement, $string);

Merci d'avance
 
WRInaute accro
il faut que dans ton masque tu vérifies que ton mot ne soit pas déjà à l'intérieur d'un <a href>
pour pouvoir faire des essais de masques offline, regex-coach est l'idéal
 
WRInaute discret
Merci je vais regarder ton lien, mais n'y a t'il pas une fonction déjà inclue dans php pour faire quelque chose de similaire car là à ce que je vois faut installer un module supplémentaire.
 
Discussions similaires
Haut