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 :

[Tableaux] Remplacer une seule fois un mot dans un texte.


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut [Tableaux] Remplacer une seule fois un mot dans un texte.
    Bonjour,

    J'ai un problème avec un script qui remplace des mots par des liens dans un texte.
    Le remplacement ce fait bien, mais si il y a N fois le mot dans le texte, ça le remplace N fois aussi. Je veux que ça ne le remplace qu'une seule et unique fois.

    Donc j'ai commi la chose ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $liste="SELECT id,libelle,urlMotClef FROM definitions ";
    $listeR=mysql_query($liste);
    while ($bob= mysql_fetch_array($listeR))
    {
    if($bob[id]!=$test){
    $libelle=$bob[libelle];
    $libelle=" $libelle ";
    $contenu=str_replace($libelle," <a href={$bob['urlMotClef']}.htm\"> $libelle </a> ",$contenu);};
    $test=$bob[id];
    }
    Ca remplace toujours tous les liens à chaque fois, comme si le str_replace remplacait tout d'un coup en faisant comme si la condition if n'existait.

  2. #2
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2004
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 265
    Points : 332
    Points
    332
    Par défaut
    Une recherche dela chaine, puis l'initialisation d'un booléen et enfin le remplacement puis sortie de la fonction ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Mais encore ?

    Tu veux que je dise au script : va voir dans le texte si il y a le mot, si tu le trouve tu dis $mot=1 , tu le remplaces, tu fais $mot ++ et tu passes au suivant.


    C'est ça l'idée ?
    Resterais à la traduire...

    **edit**
    non ça va pas, il faut encore tester si $mot==1 ou pas.

  4. #4
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2004
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 265
    Points : 332
    Points
    332
    Par défaut
    euh je croyais que tu ne voulais pas tout remplacer

    tu fais $mot ++ et tu passes au suivant
    Voulais tu remplacé ton mot par différente valeur selon son ordre d'apparition ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Je réexplique :

    J'ai une liste de mot, exemple:
    pomme
    choux
    poire
    fraise

    J'ai un texte :
    J'ai mangé une pomme, une poire, un choux, une fraise. La pomme était meilleur que la poire.

    Donc dans ce texte, mon script va remplacer, pomme, choux, poire et fraise puis il va recommencer pour pomme et poire.

    Le but c'est qu' une fois que le script a trouvé le mot pomme dans le texte, il passe au suivant et ne cherche/remplace plus les autres mots pomme.

  6. #6
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2004
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 265
    Points : 332
    Points
    332
    Par défaut
    disons un tableau contenant les mots que tu veux remplacer.

    Ensuite on recherche le premier élément de ce tableau

    si pas trouvé, alors on passe au suivant

    si trouvé alors on remplace et on incrémente l'index du tableau de 1 pour

    rechercher l'élément suivant.

    Qu'en penses tu ?

  7. #7
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    et quelque chose dans ce goût là ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $position_1_occurences = tripos($contenu);
    $contenu = substr_replace($contenu, " <a href={$bob['urlMotClef']}.htm\"> $libelle </a> ", $position_1_occurences, strlen($libelle);

  8. #8
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2004
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 265
    Points : 332
    Points
    332
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    while(array_key_exists($tab, $dix))
    {
    ...
    ton traitement
    ...
     
    $idx = $idx+1
     
    }
    Je dsl de ne pas pouvoir t'en écrire plus, je travaille en même temps sur une DLL en C++...

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Comment j'incrémente l'index du tableau et dit au script de s'arrêter à la fin de celui-ci sans boucler ?

    **edit**

    merci j'essaye ton code, ça me donne une piste déjà.

  10. #10
    Membre averti Avatar de sohnic
    Femme Profil pro
    bioinfo
    Inscrit en
    Mai 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : bioinfo

    Informations forums :
    Inscription : Mai 2003
    Messages : 426
    Points : 434
    Points
    434
    Par défaut
    Bonjour,
    Je pense que tu pourrais t'en sortir avec preg_replace, en fixant la limite a 1 (remplacement):
    $chaine=preg_replace (" /pomme/" ,'lien pomme', $ch, 1); (pas teste)

    De plus preg_replace peut prendre en charge les tableaux, donc si tes elements sont dans un tableau, tu peux faire un remplacement de tous tes mots avec une seule ligne de code.

    Bon courage,
    Sohnic

  11. #11
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2004
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 265
    Points : 332
    Points
    332
    Par défaut
    je la connaissais pas celle là

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Ah l'idée du limitateur à 1 dans le preg_replace serait super mais j'obtiens :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: preg_replace(): Delimiter must not be alphanumeric or backslash in /home/discussion/centre-commentaire.php on line 153

    le code dans la boucle while est celui-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $libelle=$bob[libelle];
    $libelle=" $libelle ";
    $contenu=preg_replace($libelle," <a href=\"{$bob['urlMotClef']}.htm\"> $libelle </a> ",$contenu,1);};

  13. #13
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2004
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 265
    Points : 332
    Points
    332
    Par défaut
    Vérifie syntaxe sur php.net

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Je suis en train de regarder sur le manuel php, ils n'ont pas l'air de mentionner la possibilité d'un délimiteur en 4eme position dans la parenthèse.

    **edit**
    en fait il faut placer une regex je pense, pas un chiffre.
    Quel est la regex qui dit "une seule fois"?
    Je suis en train de chercher, mais si vous le savez...

  15. #15
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    C'est ton expression qui doit être incorrecte. que vaut $libelle ? Pourquoi tu utilises des espaces comme délimiteurs ???

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Non ça n'est pas l'expression qui est incorrecte puisque cela fonctionne bien si je n'essaye pas de changer une et une seule fois un mot dans un texte.

    Si tu parles des espaces dans le " $libelle ", c'est pour ne pas avoir un lien du genre dé<a href="but">but</a>. Cela ça fonctionne bien aussi.

  17. #17
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Citation Envoyé par psychoBob
    Je suis en train de regarder sur le manuel php, ils n'ont pas l'air de mentionner la possibilité d'un délimiteur en 4eme position dans la parenthèse.
    Citation Envoyé par La doc de [url=http://php.net/preg_replace
    preg_replace[/url]]
    mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit [, int &count]] )
    [...]
    limit

    Le nombre maxmal de remplacement pour chaque masque dans chaque chaîne subject. Par défaut, vaut -1 (aucune limite).

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Salut Mr N,

    Non ça n'est pas l'expression qui est incorrecte puisque cela fonctionne bien si je n'essaye pas de changer une et une seule fois un mot dans un texte.

    Si tu parles des espaces dans le " $libelle ", c'est pour ne pas avoir un lien du genre dé<a href="but">but</a>. Cela ça fonctionne bien aussi.

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Salut Mr N,

    Non ça n'est pas l'expression qui est incorrecte puisque cela fonctionne bien si je n'essaye pas de changer une et une seule fois un mot dans un texte.

    Si tu parles des espaces dans le " $libelle ", c'est pour ne pas avoir un lien du genre dé<a href="but">but</a>. Cela ça fonctionne bien aussi.

  20. #20
    Membre averti Avatar de sohnic
    Femme Profil pro
    bioinfo
    Inscrit en
    Mai 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : bioinfo

    Informations forums :
    Inscription : Mai 2003
    Messages : 426
    Points : 434
    Points
    434
    Par défaut
    J'utilise assez souvent preg_replace sans probleme, mais c'est vrai toujours sur des cas simples (sans limite de remplacement et sur chaine et non des tableaux). Je n'ai fait que te rapporter la doc de php.net sur cette fonction...

    S.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [RegEx] Avancer une balise d'un mot dans un texte
    Par patbus dans le forum Langage
    Réponses: 2
    Dernier message: 12/01/2014, 22h49
  2. Remplacer une seule fois ave preg_replace ?
    Par JiB@ dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 25/06/2011, 09h47
  3. Réponses: 2
    Dernier message: 22/07/2008, 17h16
  4. Réponses: 13
    Dernier message: 18/07/2006, 23h06
  5. Réponses: 7
    Dernier message: 01/02/2006, 15h49

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