Remplacer un mot dans une phrase avec php.
Résolululuwebmaster Messages postés 430 Statut Membre -
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 ^^
- Remplacer un mot dans une phrase avec php.
- Remplacer un mot dans word - Guide
- Wannonce remplacer - Guide
- Remplacer disque dur par ssd - Guide
- Proteger un dossier avec mot de passe - Guide
- Mot de passe bios perdu - Guide
5 réponses
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.
regarde du côté des expression régulières.
Pour ton cas tu pourras identifier ta chaine par :
en ignorant la casse :
sans ignorer la casse :
[^$\s\n]*(je[\s\r]).*
[^$\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
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
$sourcestringmais sur ta chaine , soit faire :
<?phpsi 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
$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);
?>
- 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
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.
'/[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 ;)
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é.
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question