Page 1 sur 1
Quel pattern pour un preg_replace un peu particulier?
Posté : 28 août 2007, 23:11
par Nelly
Bonsoir,
J'ai un nouveau problème. J'ai une phrase du style
(les points de suspension sont n'importe quoi sauf des A et B)
Je veux remplacer A par C mais uniquement ceux qui sont suivis par des B(et sans autre A entre)
Ca donnerait :
Je ne vois pas quel pattern utiliser. Est ce que quelqu'un peut m'aider svp?
Posté : 28 août 2007, 23:40
par Bastien75
Salut,
comme motif, je te propose : "`A(?=[^AB]*B)`".
Ca donne donc :
$text = preg_replace('`A(?=[^AB]*B)`', 'C', $text);
Si tu te demandes à quoi correspond la partie bizarre avec un point d'interrogation :p , va voir
ce tuto (par exemple).
Posté : 29 août 2007, 00:43
par Invité
Ok merci bcp, ça fonctionne et je comprends mais pour simplifier, j'avais pris l'exemple de A B et C or ce sont en réalité des mots de plusieurs caractères. J'ai essayé de remplacer le [^AB] par [^(motA)(motB)] mais il exclue des qu'il y a une des lettre de motA ou de motB. Comment faire pour dire que c'est vraiment motA et motB que je ne veux pas?
Posté : 29 août 2007, 14:56
par Bastien75
Ah ok, c'est vrai que ce serait trop facile sinon

. (C'est ironique bien sûr.)
Tu peux utiliser ceci : "`motA(?=(?:[^m]|(?!motA))*motB)`". Ca me semble correct.
Posté : 29 août 2007, 15:09
par Invité
arg.... Je te remercie mais ce n'est toujours pas ça et c'est ma faute....Si j'ai bien compris, [^m] signifie qu'il ne faut pas de lettre m entre motA et motB or il peut très bien y avoir motC ou motD,...
Peux-tu encore m'aider s'il te plait?
Posté : 29 août 2007, 15:45
par Bastien75
Non non, ce coup-ci c'est moi qui me suis planté ^^.
J'espère que ceci sera correct : "`motA(?=(?:[^m]|m(?!otA))*motB)`".
J'ai mis les 2 "m" en gras pour te dire qu'ils sont à remplacer par la première lettre de motA.
Posté : 29 août 2007, 17:00
par Invité
!!!!!! Merci beaucoup!! C'est vraiment parfait. Le petit hic c'est que je n'ai pas tout compris à ce motif mais je vais essayer de me replonger là dedans...
Posté : 29 août 2007, 18:01
par Bastien75
Je vais essayer d'expliquer de façon brève.
Le but est de trouver les occurence du motA suivi par le motB sans qu'il n'y ait le motA entre les 2.
On ne veut capturer que le motA, pas la suite donc pour vérifier que cette suite satisfait bien nos conditions, on doit utiliser une assertion.
L'assertion est composée de 2 parties : (?:[^m]|m(?!otA))* et motB.
La première partie désigne n'importe quelle suite de caractères ne contenant pas le motA. En effet, chaque caractère est différent de "m" ou alors c'est un "m" mais pas suivi de "otA" (assertion avant négative).
La 2e partie est assez triviale je pense

.
Posté : 29 août 2007, 18:15
par Invité
Wouaouuuu! J'ai compris, merci encore!