Problème particulier avec Preg_replace

yanism
WRInaute discret
WRInaute discret
 
Messages: 91
Inscription: 29 Nov 2006

Problème particulier avec Preg_replace

Message le Mar Mar 01, 2011 20:38

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: Tout sélectionner
$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: Tout sélectionner
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: Tout sélectionner
$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


Leonick
WRInaute accro
WRInaute accro
 
Messages: 19595
Inscription: 8 Aoû 2004

Re: Problème particulier avec Preg_replace

Message le Mer Mar 02, 2011 13:14

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

yanism
WRInaute discret
WRInaute discret
 
Messages: 91
Inscription: 29 Nov 2006

Re: Problème particulier avec Preg_replace

Message le Mer Mar 02, 2011 14:34

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.


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités