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

Était-ce utile?

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top