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 :
Dans un fichier fonction.php j'ai cette fonction :
Dans un fichier annutool.php j'ai le script suivant :
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 :
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
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
Salut,
Avec preg_replace() c'est mieux ;)
En mettant en gras les mots par exemple :
\b est tout ce qui n'est pas un caractères de mot.
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.
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
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
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);