Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/05/2007, 15h53   #1
Inscrit
 
Inscription : juin 2006
Messages : 531
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 531
Points : 225
Points : 225
Par défaut Recréer des liens dans une chaine

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 remplacé 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
JackBeauregard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2007, 16h10   #2
Membre expérimenté
 
Inscription : septembre 2006
Messages : 685
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 685
Points : 564
Points : 564
Un simple preg_replace je pense.

Code :
1
2
3
4
5
$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);
Xunil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2007, 16h10   #3
Membre régulier
 
Homme Mallory
Étudiant
Inscription : septembre 2006
Messages : 213
Détails du profil
Informations personnelles :
Nom : Homme Mallory
Âge : 22
Localisation : Belgique

Informations professionnelles :
Activité : Étudiant
Secteur : Enseignement

Informations forums :
Inscription : septembre 2006
Messages : 213
Points : 75
Points : 75
Envoyer un message via MSN à Oprichnik Envoyer un message via Skype™ à Oprichnik
Si j'ai bien suivi tu peux faire une fonction qui prend en argument la chaîne à modifier et dans la fonction tu fais une boucle sur toute la table (mysql_fecth_array()) pour remplacer les occurrences (str_replace,preg_replace) de la chaîne par les liens de ta table..
Oprichnik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2007, 16h13   #4
Inscrit
 
Inscription : juin 2006
Messages : 531
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 531
Points : 225
Points : 225
Salut à vous, merci pour vos réponses.

Je ferais bien comme dit Xunil, mais avec son script il analyse tout le texte. N'est-ce pas possible de ne le faire que pour les mots délimités par {{ ?
Cela économiserait des ressources je pense.
JackBeauregard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2007, 16h20   #5
Membre expérimenté
 
Avatar de dj-julio
 
Inscription : décembre 2005
Messages : 742
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Finistère (Bretagne)

Informations forums :
Inscription : décembre 2005
Messages : 742
Points : 576
Points : 576
En faisant un
Code :
str_replace($ton_mot, $ton_lien, $ta_chaine);
Il faudra de toute façon que PHP analyse tout ton texte pour qu'il sache quand est-ce qu'il tombe sur ta variable $ta_chaine.
__________________
Mon Site/Cv.
dj-julio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2007, 16h37   #6
Inscrit
 
Inscription : juin 2006
Messages : 531
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 531
Points : 225
Points : 225
Citation:
Envoyé par dj-julio
En faisant un
Code :
str_replace($ton_mot, $ton_lien, $ta_chaine);
Il faudra de toute façon que PHP analyse tout ton texte pour qu'il sache quand est-ce qu'il tombe sur ta variable $ta_chaine.
C'est justement ça que je ne sais pas faire.

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.
JackBeauregard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2007, 16h50   #7
Membre expérimenté
 
Inscription : septembre 2006
Messages : 685
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 685
Points : 564
Points : 564
Si tu as des délimiteurs de mots, il suffit de les ajouter dans le masque en enlevant les \b.

Code :
preg_replace('#{(' . implode('|', $liste_mot) . '){#', '<a href="$1.htm">', $chaine);
Mais je pense que ça revient au même que si tu n'avais pas de délimiteurs.

Donc, en 1er, il faut aller chercher les mots dans la table.
Code :
1
2
3
4
5
6
7
8
9
10
$chaine = 'Je souhaite une grande maison avec un jardin.';
 
$sql = 'SELECT mot FROM la_table';
$result = mysql_query($sql);
$liste_mot = '';
while( $liste = mysql_fetch_assoc($result) )
  $liste_mot .= $liste['mot'] . '|';
$liste_mot = rtrim($liste_mot, '|');
 
echo preg_replace('#{(' . $liste_mot . '){#i', '<a href="$1.htm">', $chaine);
Xunil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2007, 17h18   #8
Inscrit
 
Inscription : juin 2006
Messages : 531
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 531
Points : 225
Points : 225
Bon alors, je fais mes tests en ligne et là le serveur est en maintenance dirait-on...

En attendant, qui peut m'expliquer le script de Xunil ?



Code :
1
2
3
4
5
6
7
8
9
10
11
$chaine = 'Je souhaite une grande maison avec un jardin.';
$sql = 'SELECT mot FROM la_table';
$result = mysql_query($sql);
$liste_mot = ''; //pourquoi est-ce vide ? 
while( $liste = mysql_fetch_assoc($result) )
  $liste_mot .= $liste['mot'] . '|'; // qu'est ce que ce .= et ce '!' ? 
$liste_mot = rtrim($liste_mot, '|');
 
echo preg_replace('#{(' . $liste_mot . '){#i', '<a href="$1.htm">', $chaine);
 //d'où sort le $1 ? 
JackBeauregard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2007, 17h32   #9
Membre expérimenté
 
Inscription : septembre 2006
Messages : 685
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 685
Points : 564
Points : 564
Bon, à ce que je vois, t'y connais pas grand chose en expressions régulières

$liste_mot est vide car c'est une déclaration de variable, je déclare toujours mes variables dans mes scripts.

Le pipe | , c'est pour le masque de la regex, et qui est un ou.

Le $1 correspond à la 1ère parenthèse capturante du masque.
Xunil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2007, 13h07   #10
Inscrit
 
Inscription : juin 2006
Messages : 531
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 531
Points : 225
Points : 225
Ok alors je crois que c'est bon avec ce code là :

Code :
1
2
3
4
5
6
7
8
9
10
11
$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 );
Merci à vous tous
JackBeauregard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2007, 14h58   #11
Membre chevronné
 
Avatar de Korko Fain
 
Étudiant
Inscription : août 2005
Messages : 632
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2005
Messages : 632
Points : 632
Points : 632
Autre solution possible :
Code php :
1
2
3
4
5
6
7
8
9
10
$sql = "SELECT libelle FROM liens ";
$result = mysql_query($sql);
$search = array();
$replace = array();
 
while( $r = mysql_fetch_array($result) ) {
   $search[] = $r['libelle'];
}
 
preg_replace('#{('.implode('|', $search).'){#i', '<a href="$1">$1</a>', $texte);
Korko Fain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2007, 14h30   #12
Inscrit
 
Inscription : juin 2006
Messages : 531
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 531
Points : 225
Points : 225
Salut Korko fain,

C'est pour le fun ta soluce, ou elle est mieux, plus rapide pour le serveur par exemple ?
JackBeauregard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2007, 11h51   #13
Membre chevronné
 
Avatar de Korko Fain
 
Étudiant
Inscription : août 2005
Messages : 632
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2005
Messages : 632
Points : 632
Points : 632
Elle doit etre un poil plus lent (preg_replace plus lent que str_replace mais moins consommatrice de mémoire (enfin c'est infime pour des petits tableau). C'est surtout pour donner une autre solution pour dire qu'yen a rarement qu'une ^^
Korko Fain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2007, 12h09   #14
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
S'il y a 1000 mots dans la table est trois liens dans la page sous la forme {xxx{, la fonction preg_replace_callback serait probablement moins gourmande dans la mesure où la vérification que xxxx est présent dans la base serait effectuée par la fonction de rappel :

Code :
1
2
3
4
5
6
7
8
9
10
11
function cb_mot_existant($m) {
    $query = mysql_query("SELECT COUNT(*) FROM liens WHERE libelle = '" . mysql_real_escape_string($m[1]) . "'");
    $array = mysql_fetch_row($query);
    if ($array[0] == 1) {
        return '<a href="' . $m[1] . '.htm">';
    } else {
        return $m[0];
    }
}
 
$out = preg_replace_callback('#\{(.+)\{#', 'cb_mot_existant', $in);
Enfin c'est un test à faire ...
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2007, 19h00   #15
Inscrit
 
Inscription : juin 2006
Messages : 531
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 531
Points : 225
Points : 225
lol bah attendons qu'une bonne âme se lance sur le test alors...

Merci à vous en tout cas.
JackBeauregard est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h32.


 
 
 
 
Partenaires

Hébergement Web