IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Recréer des liens dans une chaine [RegEx]


Sujet :

Langage PHP

  1. #1
    Inscrit
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 531
    Points : 282
    Points
    282
    Par défaut Recréer des liens dans une chaine
    Bonjour,

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    Je souhaite une grande <a href="maison.htm">maison</a> avec un jardin.
    Comment faire SVP

  2. #2
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    Un simple preg_replace je pense.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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);

  3. #3
    Membre habitué

    Homme Profil pro
    Developpeur web
    Inscrit en
    Septembre 2006
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developpeur web
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 225
    Points : 180
    Points
    180
    Par défaut
    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..

  4. #4
    Inscrit
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 531
    Points : 282
    Points
    282
    Par défaut
    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.

  5. #5
    Membre confirmé Avatar de dj-julio
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 745
    Points : 625
    Points
    625
    Par défaut
    En faisant un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  6. #6
    Inscrit
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 531
    Points : 282
    Points
    282
    Par défaut
    Citation Envoyé par dj-julio
    En faisant un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  7. #7
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    Si tu as des délimiteurs de mots, il suffit de les ajouter dans le masque en enlevant les \b.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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);

  8. #8
    Inscrit
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 531
    Points : 282
    Points
    282
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ? 

  9. #9
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    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.

  10. #10
    Inscrit
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 531
    Points : 282
    Points
    282
    Par défaut
    Ok alors je crois que c'est bon avec ce code là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  11. #11
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut
    Autre solution possible :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    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);

  12. #12
    Inscrit
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 531
    Points : 282
    Points
    282
    Par défaut
    Salut Korko fain,

    C'est pour le fun ta soluce, ou elle est mieux, plus rapide pour le serveur par exemple ?

  13. #13
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut
    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 ^^

  14. #14
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ...

  15. #15
    Inscrit
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 531
    Points : 282
    Points
    282
    Par défaut
    lol bah attendons qu'une bonne âme se lance sur le test alors...

    Merci à vous en tout cas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 19
    Dernier message: 30/05/2006, 19h43
  2. disparition des accents dans une chaine string
    Par marco62118 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 16/03/2006, 01h19
  3. ouvrir des liens dans une meme page
    Par amika dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 20/02/2006, 16h12
  4. Réponses: 3
    Dernier message: 01/02/2005, 00h18
  5. [langage] compter des caracteres dans une chaine
    Par louisis dans le forum Langage
    Réponses: 3
    Dernier message: 18/05/2004, 23h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo