Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/11/2006, 14h16   #1
Invité régulier
 
Inscription : octobre 2006
Messages : 22
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 22
Points : 5
Points : 5
Par défaut Effectuer un remplacement de mot bien précis

Bonjour à tous,

J'ai un petit code permettant de remplacer des mots d'un message par autre chose. Seulement, j'ai quelques soucis de fonctionnement..

Voici le code :
Code :
1
2
3
4
5
foreach($tabMessage as $word) {
	if(strlen($word) > 1) {
		$message = preg_replace("/" . $word . "/", "[+" . $word . "+]", $message, 1);
	}
}
Le problème se trouve dans certains cas comme par exemple : Les étoiles illuminent le ciel.
Donc j'aimerais récupérer la phrase : [+Les+] [+étoiles+] [+illuminent+] [+le+] [+ciel+].
Le problème, c'est que je récupère ceci (à cause du le) : [+Les+] [+étoi[+le+]s+] [+illuminent+] le [+ciel+].

Donc au lieu de faire le changement sur le mot "le", il trouve dans le mot étoile et du coup ça fait pas le résultat que j'attends...

Avez-vous une solution pour régler cela ?

Merci d'avance
Tommyl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2006, 14h42   #2
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Il existe le délimiteur de mot : \b. Exemple d'utilisation :
Code :
1
2
$mot = "la";
echo preg_replace('#\b(' . $mot . ')\b#i', "<b>$1</b>", "Je suis las. A ladite école. La revanche d'une blonde.");
Donne :
Citation:
Je suis las. A ladite école. La revanche d'une blonde.

Julp.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2006, 15h26   #3
Invité régulier
 
Inscription : octobre 2006
Messages : 22
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 22
Points : 5
Points : 5
Hmm merci, c'est presque bon.. (je ne connais pas trop les expressions régulières en fait.. Surtout avec ces trucs \b ou i, etc.. me faudraitun tableau listant ça avec les explications :p)

Il ne prend pas en compte les mots avec des accents ? Dans ton exemple, si je modifie le mot à changer par "école", eh bien il fait rien :/
Tommyl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2006, 16h02   #4
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Ce n'est pas mon cas à moins d'avoir mal compris votre situation. Utiliseriez un encodage "atypique" ou bien des encodages différents ? Pourriez-vous nous donner le code en question ?


Julp.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2006, 16h18   #5
Invité régulier
 
Inscription : octobre 2006
Messages : 22
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 22
Points : 5
Points : 5
L'encodage est Occidental ISO Latin 1.

En fait, le code est correct, il fait ce que j'attendais... Mais il ne prend pas tous les mots accentués...

exemple :
Code :
1
2
$mot = "école";
echo preg_replace('#\b(' . $mot . ')\b#i', "<b>$1</b>", "Je suis las. A ladite école. La revanche d'une blonde.");
Il n'affichera pas le mot école en gras.. Et j'arrive pas à comprendre pourquoi :-/
Tommyl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2006, 09h33   #6
Invité régulier
 
Inscription : octobre 2006
Messages : 22
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 22
Points : 5
Points : 5
Tu n'as pas le même problème que moi Julp ?
Tommyl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2006, 11h48   #7
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Non justement pas sous PHP-5.2.0 (PCRE version 6.7).

Sinon ces alternatives semblent fonctionner :
Code :
1
2
3
4
5
$mot = "école";
$b = '[^\wàâäéèëêîïìöôòüùû]';
echo preg_replace("#(?<=$b)($mot)(?=$b)#i", "<b>$1</b>", "Je suis las. A ladite école. La revanche d'une blonde.");
echo '<br/>';
echo preg_replace("#(?<=\P{L})($mot)(?=\P{L})#i", "<b>$1</b>", "Je suis las. A ladite école. La revanche d'une blonde.");
(en espérant ne pas m'être planté dans les assertions avant/arrière).


Julp.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2006, 14h53   #8
Invité régulier
 
Inscription : octobre 2006
Messages : 22
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 22
Points : 5
Points : 5
Ah maintenant ça marche niquel... Merci julp !

Et je met résolu en passant
Tommyl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2006, 15h22   #9
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
Citation:
Envoyé par Tommyl
Surtout avec ces trucs \b ou i, etc.. me faudraitun tableau listant ça avec les explications :p)
http://fr3.php.net/manual/fr/referen...ence.backslash
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2006, 18h01   #10
Membre émérite
 
Inscription : mai 2004
Messages : 709
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2004
Messages : 709
Points : 852
Points : 852
Les accents non reconnus dans une regex est presque toujours un problème de locale du serveur. La solution:
Code :
setlocale(LC_CTYPE, 'fr_FR.ISO-8859-1');
Instruction à mettre dans chaque script utilisant les regex ou bien changer les locale du serveur.
__________________
:q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
:quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
Jabber: ripat at im.apinc.org
ripat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2006, 19h10   #11
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
Citation:
Envoyé par ripat
Les accents non reconnus dans une regex est presque toujours un problème de locale du serveur. La solution:
Code :
setlocale(LC_CTYPE, 'fr_FR.ISO-8859-1');
Instruction à mettre dans chaque script utilisant les regex ou bien changer les locale du serveur.
setlocale depend enormement du serveur... donc si on y a pas acces pour avoir la liste des locale définies, c'est TRES difficile de trouver la chaine qui correspond a la locale a utiliser... parmis les variantes possibles :

french
fr_FR
fr_FR.ISO
fr_FR.euro
fr_FR@euro
fr_FR.880
etc...

en clair, le setlocale n'est absoluement pas portable...
S'il est necessaire de l'utiliser quand meme dans un code, je préconise un code de ce genre :

Code :
1
2
$localeList=array('french', 'fr_FR', 'fr_FR@euro', 'fr', ...);
setlocale(LC_ALL, $localeList);
qui va tester les différentes valeurs jusqu'a ce qu'une réussisse.
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h32.


 
 
 
 
Partenaires

Hébergement Web