Recréer des liens dans un texte.

WRInaute passionné
Bonjour,

Voilà j'ai un texte comme ça, par exemple :

Code:
Je souhaite une grande {maison{ avec un jardin.

J'ai une table 'liens' avec 1000 mots.

Je souhaite que si le mot "maison" se trouve dans la table 'liens', il soit remplacer dans la chaîne précédente par un lien.
Ce qui donne :

Code:
Je souhaite une grande <a href="maison.htm">maison</a> avec un jardin.

Comment faire SVP :?:
 
WRInaute passionné
Ca fonctionnera pas. Il faut un script qui relève le mot compris entre {{ et qui aille chercher dans la table 'liens' si ce mot s'y trouve et qui le cas échéant crée un lien à la place du {mot{.
 
WRInaute passionné
J'ai ça comme script :
Code:
$liste_mot = array('maison', 'voiture', 'vélo', 'jardin'); 
 
$chaine = 'Je souhaite une grande {maison{ avec un jardin.';
 
echo preg_replace('#\b(' . implode('|', $liste_mot) . ')\b#', '<a href="$1.htm">', $chaine);

L'inconvénient, c'est qu'il analyse tous les mots du texte, alors qu'il n'y a besoin de le faire que pour ceux délimité par {{
 
WRInaute impliqué
Leonick a dit:
avec un eregi_replace, après avoir vérifié que le mot existe dans la base
il semblerait que ereg disparaisse dans la future version de php, autant s'habituer à preg qui semble t-il est, en plus, bcp plus rapide ;)
 
WRInaute passionné
Va pour preg, mais c'est pareil. Comment je fais pour mettre le { dans le masque de recherche, comme dit leonick, puisque je ne connais pas à l'avance le mot à remplacer dans la chaine. Ou pour mieux dire, j'ai des centaines de textes et dans chacun d'entre eux, les mots à remplacer sont délimités par {{ je n'en ai pas la liste d'avance, ça doit être détecté à l'affichage.
 
WRInaute passionné
En fait il faut que le script fasse cela :
- Lecture du texte.
- Detection des éventuels {mot_a_remplacer_par_des_liens{
- recherche dans la table 'liens' du mot en question.
- Si il y est, on le remplace par un lien.
 
WRInaute occasionnel
Tu as intérêt à commencer par stocker en une fois toute ta table dans un tableau php, sinon tu risque de faire des centaines d'appels à ta base de données s'il y a beaucoup de mots.
Ensuite avec une expression régulière tu cherches les motif {tonmot{ et tu le remplace s'il est dans le tableau généré à partir de ta base.
 
WRInaute passionné
J'ai récupéré un script et je l'ai arrangé, mais ça fonctionne pas :

Code:
$sql = "SELECT libelle FROM liens ";
$result = mysql_query($sql);
$liste_mot = '';[color=blue] // pourquoi c'est vide ? [/color]
while( $liste = mysql_fetch_assoc($result) )
  $liste_mot .= $liste['mot'] . '|'; [color=blue]//c'est quoi ces .= et ce '!' ? [/color]
$liste_mot = rtrim($liste_mot, '|');
 
echo preg_replace('#{('.$liste_mot.'){#i', '<a href="$1.htm">', $texte);

A vrai dire, je pige pas d'où sort le $1 :oops:
 
WRInaute impliqué
essaye ceci
Code:
$sql = "SELECT libelle FROM liens ";
$result = mysql_query($sql);
$search = array();
$replace = array();

while( $r = mysql_fetch_array($result) ) {
   $search[] = '{'.$r['libelle'].'{';
   $replace[] = '<a href="'.$r['libelle'].'">'.$r['libelle'].'</a>';
}
 
$texte = str_replace( $search, $replace, $texte );
:)
 
WRInaute discret
Meeuuuhhh a dit:
J'ai récupéré un script et je l'ai arrangé, mais ça fonctionne pas :

Code:
$sql = "SELECT libelle FROM liens ";
$result = mysql_query($sql);
$liste_mot = '';[color=blue] // pourquoi c'est vide ? [/color]
while( $liste = mysql_fetch_assoc($result) )
  $liste_mot .= $liste['mot'] . '|'; [color=blue]//c'est quoi ces .= et ce '!' ? [/color]
$liste_mot = rtrim($liste_mot, '|');
 
echo preg_replace('#{('.$liste_mot.'){#i', '<a href="$1.htm">', $texte);

A vrai dire, je pige pas d'où sort le $1 :oops:

le "$1" sera remplacé par ce qui est entre parathèses dans ton critère de recherche soit ici : ('.$liste_mot.')

pour en savoir plus recherche des infos sur les expressions régulières ;)
 
WRInaute passionné
Ok, alors merci à tous, je crois que ça fonctionne.

Je dois m'occuper d'un autre script en urgence, mais avec le bout de code de julienr c'est bon.

A tout hasard, un preg_replace() ne serait pas mieux qu'un str_replace() ?

Merci à vous en tout cas :)
 
WRInaute accro
preg_replace est prévu pour une utilisation plus poussée, du genre références arrières, etc...
Là, vu qu'on remplace un mot par un autre, quand il existe, str_replace() est le plus adapté
 
Discussions similaires
Haut