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 :

Problème avec str_replace


Sujet :

Langage PHP

  1. #1
    Invité(e)
    Invité(e)
    Par défaut Problème avec str_replace
    Bonjour,

    j' ai un problème avec la fonction str_replace elle fonctionne bien sauf quand j'ai le même mot au pluriel sa me remplace même mon title (il et alors afficher a l'écran) et du coup cela case mon lien

    Voici mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function modifier_motcles($phrase) {
     
    $motCles = array('toast', 'toasts');
     
      $newMotCles = array
    ('<a href="http://www.google.com/" title="toast">toast</a>',
    '<a href="http://www.google.com/" title="toasts">toasts</a>');
     
    	$newphrase = str_replace($motCles, $newMotCles, $phrase);
     
     
    	return $newphrase;
    	}
    Merci pour vos réponses.
    Dernière modification par Deepin ; 08/10/2010 à 09h53. Motif: merci d'utiliser la balise code (bouton # de l'editeur)!!

  2. #2
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 115
    Points : 70
    Points
    70
    Par défaut
    Chez moi cette fonctionne la fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function remplacer_Mots_Clefs($phrase) 
    {
    	$motsClefs = array('toast','toasts');
    	$motsRemplacants = array
    	('<a href="http://www.google.com/" title="toast">toast</a>',
    	'<a href="http://www.google.com/" title="toasts">toasts</a>');
    	$compteur = 0;
    	foreach ($motsClefs as $valeur)
    	{
    		$phrase = str_replace($motsClefs[$compteur], $motsRemplacants[$compteur], $phrase);
    		$compteur++;
    	}
    	return $phrase;
    }
    Un petit conseil, nomme tes variables plus explicitement, sinon tu vas t'arracher les cheveux lors de la relecture du code :/

  3. #3
    Invité(e)
    Invité(e)
    Par défaut
    sa ne fonctionne pas

    merci quand même et ton compteur je vois pas l'intérêt?

  4. #4
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 115
    Points : 70
    Points
    70
    Par défaut
    Pour chaque paire de valeur motClef / motRemplacant je fais un tour de boucle dans lequel je vérifie la présence de mots à remplacer.
    Compteur permet de naviguer dans les tableaux pour remplacer les bonnes valeurs

    Chez moi ca fonctionne, mais je présume que tu n'utilise pas les même phrases que moi pour tester, tu pourrais me donner des exemples d'utilisation de ta fonction?

  5. #5
    Invité(e)
    Invité(e)
    Par défaut
    Oui j'ai compris au final mes sa ne fonctionne toujours pas il ya que toast qui et pris en compte et le s non voici mon code:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    function smarty_modifier_motcles($phrase) 
    {
    	$motCles = array('toast','toasts');
    	$newMotCles = array
    	('<a href="http://www.google.com/" title="toast">toast</a>',
    	'<a href="http://www.google.com/" title="toasts">toasts</a>');
     
    	$compteur = 0;
    	foreach ($motCles as $valeur)
    	{
    		$phrase = str_replace($motCles[$compteur], $newMotCles[$compteur], $phrase);
    		$compteur++;
    	}
    	return $phrase;
    }
    Dernière modification par Deepin ; 08/10/2010 à 09h54. Motif: merci d'utiliser la balise code (bouton # de l'editeur)!!

  6. #6
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 115
    Points : 70
    Points
    70
    Par défaut
    En fait j'aurais aimé avoir la valeur de ta variable phrase lors de l'appel de ta fonction.


    Le soucis peut venir du fait que, lorsque tu appelles ta fonction, elle remplace les mots clefs tours à tour. ta fonction remplacera le mot toast correctement, mais elle remplacera également le toast de <toast>er, ou de <toast>s.

    Tu peux également avoir le soucis d'un remplacement récursif, dans un premier temps, tu remplace toast par ton lien, mais lors de la vérification du second mot clef, tu risque de remplacer des choses parmi ce que tu as déjà remplacé. (j'espère que tu me suis... :p)
    Ordre de remplacement

    A cause du fait que la fonction str_replace() effectue les remplacements de la gauche vers la droite, elle peut remplacer une valeur précédemment insérée lors de multiples remplacements.
    (php.net)

    Cela fait donc deux choses à gérer...


    Une idée pour palier à cela : Faire un premier remplacement en générant un "mot unique" aléatoire (un md5 du mot remplacant ou du mot clef), et de faire une seconde serie de remplacement afin de remplacer ces md5 par les valeurs de remplacements...


    Quelque chose du genre (pas testé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    function remplacer_Mots_Clefs($phrase) 
    {
        $motsClefs = array('toast','toasts');
        $md5MotsClefs = array(md5('toast'),md5('toasts'));
        $motsRemplacants = array
        ('<a href="http://www.google.com/" title="toast">toast</a>',
        '<a href="http://www.google.com/" title="toasts">toasts</a>');
        $compteur = 0;
        foreach ($motsClefs as $valeur)
        {
            $phrase = str_replace($motsClefs[$compteur], $md5MotsClefs[$compteur], $phrase);
            $compteur++;
        }
    $compteur = 0;
        foreach ($md5MotsClefs as $valeur)
        {
            $phrase = str_replace($md5MotsClefs[$compteur], $motsRemplacants[$compteur], $phrase);
            $compteur++;
        }
        return $phrase;
    }

    Edit : réinitialise le compteur avant la seconde boucle sinon ca marchera pas

  7. #7
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,
    Cela ne fonctionne toujours pas les s ne sont pas pris en compte.


    Merci

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function modifier_motcles($phrase)
    {
        $motCles = array('/\b(toast)\b/ui', '/\b(toasts)\b/ui'); 
        $newMotCles = '<a href="http://www.google.com/" title="$1">$1</a>';
     
        $newphrase = preg_replace($motCles, $newMotCles, $phrase);
     
        return $newphrase;
    }
     
    echo modifier_motcles('super toast, hyper toasts');

  9. #9
    Invité(e)
    Invité(e)
    Par défaut
    merci cela marche j'ai un peu de mal avec les expressions régulière peut tu m'expliquer comment faire si j'ai une grande liste de mots a remplacer?

    genre : thon, haricot, haricots, fleur

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    comme ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    function modifier_motcles($phrase)
    {
        $motCles = array('toast', 'toasts', 'thon', 'haricot', 'haricots', 'fleur'); 
     
        foreach($motCles as $motCle)
        {
            $pattern[] = '/\b(' . preg_quote($motCle) . ')\b/ui';
        }
     
        $newMotCles = '<a href="http://www.google.com/" title="$1">$1</a>';
     
        $newphrase = preg_replace($pattern, $newMotCles, $phrase);
     
        return $newphrase;
    }
     
    echo modifier_motcles('super toast, hyper toasts et top fleur');

  11. #11
    Invité(e)
    Invité(e)
    Par défaut
    oui merci mes si je veut différent lien pour les différents mots?

  12. #12
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    Citation Envoyé par seiyar92 Voir le message
    oui merci mes si je veut différent lien pour les différents mots?
    ah oui
    comme au début, tu fais un array, et $1 correspond au mot

  13. #13
    Invité(e)
    Invité(e)
    Par défaut
    merci je vais essayer

  14. #14
    Invité(e)
    Invité(e)
    Par défaut
    j'ai faits différent test je bug voila mon derniers code:



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    function smarty_modifier_motcles($phrase) {
     
     
     
    				$motCles = array('/\b(toast)\b/ui', '/\b(toasts)\b/ui','/\b(vieux)\b/ui', '/\b(bleu)\b/ui'); 
     
     
    				$newMotCles = '<a href="http://www.google.com/" title="$1">$1</a>';
    							 '<a href="http://www.vieux.com/" title="$2">$2</a>';
    							 '<a href="http://www.bleu.com/" title="$3">$3</a>';
     
     
        $newphrase = preg_replace($motCles, $newMotCles, $phrase);
     
        return $newphrase;
    }
    Dernière modification par Deepin ; 11/10/2010 à 09h33. Motif: merci d'utiliser la balise code (bouton # de l'editeur)!!

  15. #15
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    c'est toujours $1
    et il te faut autant de $motCles que de newMotCle

  16. #16
    Invité(e)
    Invité(e)
    Par défaut
    oui mes quand je fais cela c'est tous les mot ont le même lien c'est a dire http://www.google.com/

  17. #17
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    Citation Envoyé par seiyar92 Voir le message
    oui mes quand je fais cela c'est tous les mot ont le même lien c'est a dire http://www.google.com/
    t'as pas fait d'array...

  18. #18
    Invité(e)
    Invité(e)
    Par défaut
    oui j'avais vue merci je vais teste avec tout mes mots

  19. #19
    Invité(e)
    Invité(e)
    Par défaut
    ok c'est bon merci une dernière chose peut tu m'expliquer '/\b(tosta)\b/ui',

    les /\b et \b/ui


    merci d'avance

  20. #20
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    Citation Envoyé par seiyar92 Voir le message
    ok c'est bon merci une dernière chose peut tu m'expliquer '/\b(tosta)\b/ui',

    les /\b et \b/ui


    merci d'avance
    biensur

    \b c'est une limite de mot
    u c'est pour le mode UTF-8
    i pour le mode insensible a la casse

    donc on a

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    /      : délimiteur (début)
    \b     : limite de mot
    (      : début du groupe
    tosta  : le mot
    )      : fin de groupe
    \b     : limite de mot
    /      : délimiteur (fin)
    u      : option u
    i      : option in

Discussions similaires

  1. [PHP 5.2] Problème avec str_replace
    Par daquad dans le forum Langage
    Réponses: 2
    Dernier message: 29/12/2009, 16h56
  2. Réponses: 3
    Dernier message: 13/01/2008, 00h16
  3. [Tableaux] problème avec str_replace en boucle
    Par kev2259 dans le forum Langage
    Réponses: 2
    Dernier message: 21/02/2007, 17h46
  4. Problème avec str_replace()
    Par vinche999 dans le forum Langage
    Réponses: 6
    Dernier message: 13/02/2006, 10h23
  5. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 17h10

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