Remplacer un mot dans une phrase avec php.

Résolu/Fermé
luluwebmaster Messages postés 409 Date d'inscription mardi 19 février 2013 Statut Membre Dernière intervention 3 février 2018 - Modifié par luluwebmaster le 12/11/2013 à 16:13
luluwebmaster Messages postés 409 Date d'inscription mardi 19 février 2013 Statut Membre Dernière intervention 3 février 2018 - 23 nov. 2013 à 21:41
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

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
luluwebmaster Messages postés 409 Date d'inscription mardi 19 février 2013 Statut Membre Dernière intervention 3 février 2018 5
12 nov. 2013 à 16:24
Le soucis, c'est que je veux pas remplacer un chaîne, mais un mot, contenu dans une variable
0
Utilisateur anonyme
12 nov. 2013 à 16:51
.... 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
luluwebmaster Messages postés 409 Date d'inscription mardi 19 février 2013 Statut Membre Dernière intervention 3 février 2018 5
12 nov. 2013 à 16:53
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
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
luluwebmaster Messages postés 409 Date d'inscription mardi 19 février 2013 Statut Membre Dernière intervention 3 février 2018 5
12 nov. 2013 à 17:20
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
Utilisateur anonyme
12 nov. 2013 à 17:31
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
luluwebmaster Messages postés 409 Date d'inscription mardi 19 février 2013 Statut Membre Dernière intervention 3 février 2018 5
12 nov. 2013 à 20:14
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
Utilisateur anonyme
13 nov. 2013 à 07:44
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
luluwebmaster Messages postés 409 Date d'inscription mardi 19 février 2013 Statut Membre Dernière intervention 3 février 2018 5
13 nov. 2013 à 07:47
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
'/[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
luluwebmaster Messages postés 409 Date d'inscription mardi 19 février 2013 Statut Membre Dernière intervention 3 février 2018 5
13 nov. 2013 à 10:21
Je regarde le tuto de ccm, mais c'est compliqué.
0
Utilisateur anonyme
13 nov. 2013 à 11:17
oui c'est pas évident au début, mais ca vient vite ;)
0
luluwebmaster Messages postés 409 Date d'inscription mardi 19 février 2013 Statut Membre Dernière intervention 3 février 2018 5
17 nov. 2013 à 17:09
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
Utilisateur anonyme
19 nov. 2013 à 07:43
montre moi tout le code car je ne vois pas ce que tu veux dire
0
luluwebmaster Messages postés 409 Date d'inscription mardi 19 février 2013 Statut Membre Dernière intervention 3 février 2018 5
19 nov. 2013 à 07:48
$texte = preg_replace('/[^$\s\n](mon_mot[\s\r\b\.\,\ \?\!\:\;])/', nouveau_mot, $texte);
0
Utilisateur anonyme
19 nov. 2013 à 08:48
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
luluwebmaster Messages postés 409 Date d'inscription mardi 19 février 2013 Statut Membre Dernière intervention 3 février 2018 5
19 nov. 2013 à 09:01
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
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
luluwebmaster Messages postés 409 Date d'inscription mardi 19 février 2013 Statut Membre Dernière intervention 3 février 2018 5
22 nov. 2013 à 20:51
Ok, merci beaucoup !

Problème résolut !

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

0
Utilisateur anonyme
23 nov. 2013 à 12:36
merci j'ai essayé de faire au mieux x)

bon dev ;)
naga
0
luluwebmaster Messages postés 409 Date d'inscription mardi 19 février 2013 Statut Membre Dernière intervention 3 février 2018 5
23 nov. 2013 à 21:41
Merci beaucoup !
0