RegEx: combinando e substituindo ABC em “AB ABC D”
-
22-08-2019 - |
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
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);