RegEx: l'appariement et le remplacement ABC dans « AB ABC D »
-
22-08-2019 - |
Question
Je besoin de conseils sur ce bout
$text = preg_replace('|(A.*)?A(.*)C|', '$1foo$2bar', $text);
Cela correspond à ABC "AB ABC D", et le remplacer par "AB fooBbar D"; comme vous pouvez le voir correspond à la partie « AB » au début et que je dois répéter dans la chaîne de remplacement avec 1 $, afin de ne pas perdre.
Est-ce la meilleure façon d'obtenir un tel résultat?
Y at-il un drapeau X tel que
$text = preg_replace('|A(.*)C|X', 'foo$1bar', $text);
produit le même résultat?
J'espère que je suis clair
Merci!
modifier : Considérons A, B, C en tant que chaînes de caractères arbitraires atomiques, ils peuvent contenir des espaces blancs et
En outre, l'exemple présenté est en buggy fait, car il correspond à la deuxième « ABC » dans « ABC ABC ».
EDIT2 : Je suis désolé, je l'ai probablement expliqué le problème très mal. Le point est que je voudrais faire correspondre tout entre deux A, la chaîne C, de sorte qu'il n'y a pas une sous-chaîne dans le match
Encore une fois merci
La solution
La question a été clarifiée, essayez cette expression:
preg_replace('/(?:A)+(.+?)(?:C)+/', 'foo$1bar', $text)
Un exemple:
$A = 'abc'; $B = '123'; $C = 'xyz';
$text = "$A$B$C $A$A$B$C $A$B$C$C";
echo preg_replace("/(?:$A)+(.+?)(?:$C)+/", 'foo$1bar', $text);
Autres conseils
Que diriez-vous ceci:
$text = preg_replace('|A(\S*)C|', 'foo$1bar', $text);
Le \S
correspond à un caractère non-blanc, de sorte que vous ne remplacerez pas dans des mots différents.
Après avoir vu certains des commentaires de OP, je hasarde une autre estimation:
$text = preg_replace('|A(B)C|', 'foo$1bar', $text);
Utilisez la version non gourmande du *
quantificateurs:
$text = preg_replace('|(.*)(A.*?C)|', '$1foo$2bar', $text);