2009-02-08 7 views
0

je besoin de conseils sur ce boutRegEx: mise en correspondance et en remplaçant ABC dans "AB ABC D"

$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, cela correspond également à la partie "AB" au début, que je dois répéter dans la chaîne de remplacement avec 1 $, pour ne pas la 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!

EDIT: Considérez A, B, C sous forme de chaînes atomiques de caractères arbitraires, 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é, j'ai probablement très mal expliqué le problème. Le point est que je veux correspondre quel que soit 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

+0

La prochaine fois, vous devriez trouver un exemple dans le monde réel. :-) Les exemples "ABC" inventés ne sont pas idéaux (comme vous l'avez vu). – Tomalak

+0

Quelle devrait être la sortie désirée pour "A AABCC C"? –

+0

@NoWhereMan: Pouvez-vous expliquer pourquoi un simple preg_replace ('| A (B) C |', 'foo $ 1bar', $ text) ne fonctionne pas? –

Répondre

0

Comme la question a été clarifié, 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); 
+0

A (. +?) C correspond également à A C B C, et [^ C] ce n'est pas approprié car C est en fait une chaîne (par exemple, il peut s'agir de 'foo'); désolé, j'ai probablement édité la description pendant que vous donniez votre réponse –

+0

Je pense que c'est le meilleur, merci –

1

Que diriez-vous ceci:

$text = preg_replace('|A(\S*)C|', 'foo$1bar', $text); 

Le \S correspond à un caractère non-espace, donc vous ne le remplacerez pas à travers 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); 
+0

Bien, mais j'avais besoin de faire correspondre les espaces blancs, je voulais dire ABC comme arbitraire A, B, C cordes, je devrais probablement expliquer cela mieux. –

1

Utilisez la version non gourmande du * quantificateurs:

$text = preg_replace('|(.*)(A.*?C)|', '$1foo$2bar', $text); 
+0

J'ai essayé cela et il correspond à AABC dans "AABC", et pas seulement ABC –

+0

Droit, édité pour ajouter une correspondance gourmande au début. – kmkaplan

Questions connexes