Remplacer un mot dans une phrase avec php.

Résolu
Hello tout le monde,

je suis face a un problème assez embarrassent :

J'ai un chaîne de caractère de type
<?php
$chaine = "Je suis une chaîne de caractères.<br />

Jeux.

lune";
?>

Dans cette chaîne de caractère, je voudrais trouver juste le MOT "je", ou "une", et le remplacer par un autre.

J'utilise la fonction str_replace de PHP.

Le soucis qu'il y a avec cette fonction, c'est qu'elle va chercher dans tous les mots si la chaîne demandé n'y est pas.

Ex :
Je veux cherche le mot "je".

Il me remplacera le mot "je" ET le mot "jeux" ce que je ne veux pas.

De même pour le mot "une".

Comment remédier à ce problème ?

Merci d'avance.

Merci a tout ceux qui répondrons a mes problème ^^

5 réponses

Résumé de la discussion

La problématique porte sur remplacer uniquement des mots entiers ('je', 'une') dans une chaîne PHP sans toucher les occurrences partielles comme 'jeux', en privilégiant les expressions régulières adaptées. Plusieurs contributeurs évoquent l’utilisation des délimiteurs de mot et des expressions régulières, avec des tests en ligne et des ajustements autour des caractères de fin de mot et des espaces. Des propositions incluent des variantes pour éviter les correspondances partielles, puis des démonstrations qui montrent l’intérêt des limites de mot comme les frontières \b et des conditions sur la fin ou le début de chaîne. En pratique, plusieurs échanges soulignent qu’on peut opérer sur des mots simples avec cette approche et que le choix des délimiteurs doit tenir compte des caractères non alphabétiques adjacents.

Bobot (l’IA à votre service)
  1. salut,

    regarde du côté des expression régulières.

    Pour ton cas tu pourras identifier ta chaine par :
    en ignorant la casse :
     
    
    [^$\s\n]*(je[\s\r]).*
    sans ignorer la casse :
    [^$\s\n]*([Jj]{1}[eE]{1}[\s\r]).*
    


    ce qui peu donner en php :
    <?php
    

    $sourcestring="your source string";

    echo preg_replace('/[^$\s\n]*([Jj]{1}[eE]{1}[\s\r]).*/','TA NOUVELLE CHAINE',$sourcestring);

    ?>



    tu peux faire des tests et afficher le code php correspondant ici :
    https://www.myregextester.com/index.php

    naga
    0
    1. Le soucis, c'est que je veux pas remplacer un chaîne, mais un mot, contenu dans une variable
      0
      1. .... un mot est une chaine , et ta variable est de type chaine, le but est donc de modifier une sous chaine contenu dans une chaine.
        0
      2. J'essais de comprend un peux le code donné, mais c'est compliqué,

        car le code donné ne répond pas a mon exemple ( a moins que je ne le comprenne pas comme il faut ).
        0
      3. as-tu regardé l'aide de preg_replace?

        En gros, tu lui dis " si tu trouve une chaine de ce type [dans ton cas, 'je'], remplace le par '...' [ta nouvelle chaine donc]" , et lui te renvoi la nouvelle valeur.

        Pour ce qui est de la chaine qui doit te sembler étrange, il faut que tu te renseigne sur les expressions régulières et leur construction (je t'ai déjà donné le lien pour tester).

        Dans l'exemple que je t'ai donné, le test n'est bien sûr pas à faire sur
        $sourcestring
        mais sur ta chaine , soit faire :
        <?php
        

        $chaine = "Je suis une chaîne de caractères.<br />

        Jeux.

        lune";

        echo preg_replace('/[\s\n>]*([Jj]{1}[eE]{1}[\s\r<]).*/','TA NOUVELLE CHAINE',$chaine);
        ?>
        si tu veux le faire en le codant toi-même, il faut que tu test tous tes caractères, en prennant en compte le fait que "je" doit être complet, c'est à dire qu'il faut qu'il commence
        - soit en début de chaine
        - soit aprèsun espace
        - soit après un saut de ligne
        - soit après la fermeture d'une balise
        et qu'il se termine
        - soit en fin de chaine
        - soit par un espace
        - soit par un saut de ligne
        - soit après l'ouverture d'une balise

        (je pense avoir fait le tour, mais à vérifier au cas où)

        naga
        0
      4. Je viens de tester le code, ilme retourne ça :

        TA NOUVELLE CHAINE Jeux. lune

        Moi, je ne veux pas qu'il me retourne ça, je veux qu'il me remplace le "je" par "TA NOUVELLE CHAINE"

        je ne connais pas bien la fonction preg_replace, et expressions régulières.
        0
      5. autant pour moi, le tableau à remplacer ne prend pas l'indice de la parenthèse mais celui de l'expression entière.

        il faut donc mettre :
        [Jj]{1}[eE]{1}[\s]{1}

        soit
        echo preg_replace('/[Jj]{1}[eE]{1}[\s]{1}/','TA NOUVELLE CHAINE',$chaine);
        
        0
    2. Re,

      le code fonctionne bien, mais j'aimerais encore savoir une chose :

      le code ne détecte pas un mot a la fin d'un texte, sans qu'il y ai un trou juste après ce dernier.

      C'est possible de remédier à ce problème ?

      Merci beaucoup.
      0
      1. salut,
        désolé je ne passe pas sur ccm le soir.

        Donc oui le caractère fin de chaine dans les regex est soit '$' soit '^' (j'ai toujours un doute, il me semble que c'est le dollar mais pas certain).

        naga
        0
      2. C'est le $ https://www.commentcamarche.net/contents/803-php-expressions-regulieres
        .
        Mais je dois placer ou et comment les caractère qui détermine la fin ?
        0
      3. '/[Jj]{1}[eE]{1}[\s$]{1}/'

        en tant que dernier caractère, vu que le caractère qui suivra sera soit un espace soit une fin de chaine, on énumère les possibilitée entre les crochets ( [ ] ) et je dis de n'en prendre qu'un ( {1} ).

        Tu as des tutoso très bien sur les expressions régulières et bien que ca semble plutot difficile dans un premier abord à cause de la synthaxe, c'est en fait plutôt simple, au début t'essaye plein de possibilités qui marcheront pas avant d'avoir la bonne expression, et petit à petit tu trouve la bonne plus vite, faut comprendre et pratiquer quoi, comme un peu tout ;)
        0
      4. Je regarde le tuto de ccm, mais c'est compliqué.
        0
      5. oui c'est pas évident au début, mais ca vient vite ;)
        0
    3. Salut,

      j'ai cette chaine :

      /[^$\s\n]*(Mon_mot[\s\r\b\.\,\ \?\!\:\;]{1})/

      Le soucis est le même qu'avec str_replace, il rne distingue pas chaque, puis recherche le mot demandé.
      0
      1. montre moi tout le code car je ne vois pas ce que tu veux dire
        0
      2. $texte = preg_replace('/[^$\s\n](mon_mot[\s\r\b\.\,\ \?\!\:\;])/', nouveau_mot, $texte);
        0
      3. donc ok ca ne vas te cherche que la première occurrence.
        Rajoute autour :
        
        while ( preg_match('/[^$\s\n](mon_mot[\s\r\b\.\,\ \?\!\:\;])/',$texte) != 0)
        {
             $texte = preg_replace('/[^$\s\n](mon_mot[\s\r\b\.\,\ \?\!\:\;])/', nouveau_mot, $texte);
        }
        
        


        pour TOUS les modifier
        0
      4. Je viens de faire un test :

        <?php
        $texte = "Je suis un texte avec mon_mot ";
        while ( preg_match('/[^$\s\n](mon_mot[\s\r\b\.\,\ \?\!\:\;])/',$texte) != 0)
        {
             $texte = preg_replace('/[^$\s\n](mon_mot[\s\r\b\.\,\ \?\!\:\;])/', 'nouveau_mot', $texte);
        }
        echo $texte;
        ?>
        


        Le mot n'est pas remplacé.
        0
      5. oui, tu ne lui dis pas qu'il peu y avoir d'autre caractères (je n'ai pas vérifier ton expression avant).
        soit :
        /[^$\s\n].*?(mon_mot[\s\r\b\.\,\ \?\!\:\;]?).*/
        


        je me repete, mais tu peux tester tes expressions régulières en ligne. Par exemple : https://www.myregextester.com/index.php

        naga
        0
    4. Ok, merci beaucoup !

      Problème résolut !

      C'était super bien expliqué, merci à toi !

      0
      1. merci j'ai essayé de faire au mieux x)

        bon dev ;)
        naga
        0
      2. Merci beaucoup !
        0