Pergunta

Eu preciso de conselhos sobre esse trecho

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

Isso irá corresponder a ABC em "AB ABC D", e substituí-la por "AB fooBbar D"; como você pode ver isso corresponde a parte "AB" no início, assim, que eu tenho que repetir no texto de substituição com US $ 1, a fim de não perdê-lo.

Esta é a melhor maneira de obter tal resultado um?

Existe uma bandeira X tal que

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

produz o mesmo resultado?

Espero ter sido claro

Obrigado!

Editar : Considere A, B, C como cadeias atômicas de caracteres arbitrários, eles podem conter espaços em branco, bem

Além disso, o exemplo apresentado é de fato de buggy, uma vez que corresponde apenas a segunda "ABC" em "ABC ABC".

EDIT2 : Eu sinto muito, eu provavelmente já explicou o problema muito mal. O ponto é que eu gostaria de corresponder qualquer que seja é entre dois Um, corda C, de modo que não há substring A no jogo

novamente graças

Foi útil?

Solução

Como a questão foi esclarecida, tente esta expressão:

preg_replace('/(?:A)+(.+?)(?:C)+/', 'foo$1bar', $text)

Um exemplo:

$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);

Outras dicas

Como sobre isto:

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

O \S corresponde a um caractere não-espaço em branco, assim você não vai substituir em palavras diferentes.


Depois de ver alguns dos comentários do OP, eu vou arriscar outro palpite:

$text = preg_replace('|A(B)C|', 'foo$1bar', $text);

Use a versão não-ganancioso do quantificador *:

$text = preg_replace('|(.*)(A.*?C)|', '$1foo$2bar', $text);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top