Ereg_replace : pb de regexp

Fermé
Edouard - 28 août 2007 à 14:56
 Edouard - 28 août 2007 à 18:17
Bonjour,
j'ai un problème de regexp.

je veux faire le remplacement de mots (stockés dans une base mysql) par des liens hypertextes :

exemple :
j'ai ma table remplacement :
musée | http://www.musee.com

j'ai une chaîne de caractère :
$string="ma chaîne avec les mots à remplacer : musée, ou Musée ou musée, ou musée. Mais attention pas musées.";

ICI je n'arrive pas à trouver la bonne fonction et la mettre en oeuvre pour remplacer musée ou Musée suivit ou non de caractères de ponctuation mais pas quand le mot fait partie d'une autre mot (musées).

En effet str_replace et stri_replace ne le permettent pas car systématiquement php me mettra le mot musée en minuscule et ne tiendra pas compte des espaces.

Le mieux pour l'instant c'est çà, qui gère les espaces de part et d'autre, mais je ne gère pas les ponctuations :
$SEARCH=array("musée");
$REPLACE=array("<a...> musée </a>");
$BIGREPLACE=array("<a...> Musée </a>");
foreach ($SEARCH as $key => $value){
$string2=str_replace(str_pad($value, strlen($value)+2," ", STR_PAD_BOTH),$REPLACE["$key"],str_replace(str_pad(ucfirst($value), strlen($value)+2," ", STR_PAD_BOTH),$BIGREPLACE["$key"],$string));
}

Si quelqu'un sait comment utiliser ereg_replace, pour faire ce que je recherche je serais preneur.

Merci d'avance.

Edouard

4 réponses

Salut,

Je suis pas sûr de saisir ce que tu voulais faire avec implode mais finalement et grâce à ton aide, j'ai réussi à faire ce que je voulais, voici une solution à fignioler mais foncionnelle :

Dans une base MySQL j'ai la structure suivante :
CREATE TABLE `annuaire` (
`id` INT NOT NULL AUTO_INCREMENT ,
`motcle` VARCHAR( 20 ) NOT NULL ,
`infobulle` VARCHAR( 100 ) NOT NULL ,
`url` VARCHAR( 100 ) NOT NULL ,
`target` INT( 1 ) NOT NULL ,
PRIMARY KEY ( `id` ) 
);


Dans un fichier fonction.php j'ai cette fonction :
// Retourne les valeurs remplacées de l'annuaire
function AnnuWord($chaine,$SEARCH,$REPLACE,$BIGREPLACE){
$chaine = preg_replace("[\r\s]", "", $chaine);
foreach ($SEARCH as $key => $value){
$pattern="#\b".$value."\b#";
$bigpattern="#\b".ucfirst($value)."\b#";
$replacement=$REPLACE["$key"];
$bigreplacement=$BIGREPLACE["$key"];
$chaine = preg_replace($pattern,$replacement,$chaine);
$chaine = preg_replace($bigpattern,$bigreplacement,$chaine);
}
return $chaine;
}


Dans un fichier annutool.php j'ai le script suivant :
<?
// tableau de caractères spéciaux
$carspec=array("'","\"");
$carremp=array("´",""");
// Requête de remplacement
$sqlreplace=mysql_query("select* from annuaire");
$nbrlignesqlreplace=mysql_num_rows($sqlreplace);//nombre de ligne
if ($nbrlignesqlreplace=="0"){
echo AuStripSlashes("Il n'y a pas de données de remplacement !");
}//fin if
else{
while ($rowsqlreplace=mysql_fetch_array($sqlreplace))
{
// récupération des valeurs ligne à ligne
$Id_replace=$rowsqlreplace["id"];
$motcle_replace=$rowsqlreplace["motcle"];
//pour ne pas être ennuyé par les apostrophes
$infobulle_replace=str_replace($carspec,$carremp,$rowsqlreplace["infobulle"]);
$url_replace=$rowsqlreplace["url"];
$target_replace=$rowsqlreplace["target"];
//echo "$rowsqlreplace[infobulle]<br>";
//echo "$infobulle_replace";
//affectation des colonnes dans les tableaux 'SEARCH'
$SEARCH[]=$motcle_replace;
//$SEARCH[]=str_pad($motcle_replace, strlen($motcle_replace)+2, " ", STR_PAD_BOTH);
//affectation des colonnes dans les tableaux 'REPLACE'
if($target_replace=="1"){
// on utilise un target blank
$lieninfobulle="<a target=\"_blank\" href=\"".$url_replace."\" OnMouseOver=\"BulleWrite('".$infobulle_replace."');\" OnMouseOut=\"BulleHide ();\">".$motcle_replace."</a>";
$REPLACE[]=$lieninfobulle;
$BIGlieninfobulle="<a target=\"_blank\" href=\"".$url_replace."\" OnMouseOver=\"BulleWrite('".$infobulle_replace."');\" OnMouseOut=\"BulleHide ();\">".ucfirst($motcle_replace)."</a>";
$BIGREPLACE[]=$BIGlieninfobulle;
}//fin if
else{
// on ouvre le lien dans la même page
$lieninfobulle="<a href=\"".$url_replace."\" OnMouseOver=\"BulleWrite('".$infobulle_replace."');\" OnMouseOut =\"BulleHide ();\">".$motcle_replace."</a>";
$REPLACE[]=$lieninfobulle;
$BIGlieninfobulle="<a href=\"".$url_replace."\" OnMouseOver=\"BulleWrite('".$infobulle_replace."');\" OnMouseOut =\"BulleHide ();\">".ucfirst($motcle_replace)."</a>";
$BIGREPLACE[]=$BIGlieninfobulle;
}//fin else
// ensuite on appliquera le remplacement de mot dans les chaines aux variables issues de la seconde requête
}//fin while
}//fin else
?>


Dans tous les fichiers où il y a des chaînes qui pourraient contenir des mots à remplacer je traite les chaines avec la fonction comme ceci :

// en haut de page 'j'initialise mon script annutool.php :
// initialisation du moteur de remplacement
if(file_exists("annutool.php")) include("annutool.php");

...

// plus loin je traite mes chaines de caractères (ici issues d'une requête sql) :
$Texte2_actualite_ligne=AnnuWord($row["Texte2_actualite"],$SEARCH,$REPLACE,$BIGREPLACE);


A améliorer par qqn qui connait la programmation objet pour faire une vraie class, son initialisation et une fonction propre, mais bon déjà ça marche !

Edouard
1
Salut,

Avec preg_replace() c'est mieux ;)

En mettant en gras les mots par exemple :
echo preg_replace('#\bmusée\b#i', '<b>$0</b>', $string);

\b est tout ce qui n'est pas un caractères de mot.
0
Merci pour l'info, je vais tester ce soir.
Si je veux conserver ma boucle, comment met on une variable dans ta regex ?

'#\b$value\b#i' ? ça passe ça ?

merci d'avance
Edouard
0
Oui en mettant ta variable dans le pattern.
preg_replace('#\b' . $value . '\b#i', '<b>$0</b>', $string);
Par contre si $value est un array, il faut procéder autrement, pas besoin de foreach()
$value = array('musée', 'monument', 'collection");
$string = preg_replace('#\b(' . implode('|', $value) . '\b#i', '<b>$0</b>', $string);
0