Suporte para escape na substituição de expressão regular

Substituição simples

A substituição de strings é freqüentemente usada como uma forma de aplicar modelos. Você pode substituir "%a:test"com "~~test~~"usando a expressão regular: %a:(w+), substituindo-o “~~$1~~”.

Tentando escapar

O único problema agora é que não posso usar “%a:”mais nada dentro da minha string. Isso poderia ser resolvido permitindo o escape usando a barra invertida. No regexp podemos usar um lookbehind negativa para ver se o caractere antes do% não é uma barra invertida: (?<!\)%a:(w+).

Fugindo da fuga

Agora estamos perto, porém agora não é possível usar em %:aqualquer lugar. Precisamos ser capazes de escapar da barra invertida também. Poderíamos afirmar que o problema precisa corresponder a% a se não houver um número ímpar de barras invertidas na frente dele. Verificar se há um número ímpar em um lookbehind negativo não é possível, infelizmente, então precisamos colocar as barras invertidas na correspondência. Podemos dizer: corresponda a 0 ou mais pares de barras invertidas, seguido por “%a:”, se não houver barra invertida na frente dele. Isso resulta em regexp:, (?<!\)((?:\{2})*+)%a:(w+)substituindo-o por $1~~$2~~”.

Para terminar

A única coisa é isso %e \ainda será exibido assim. Isso pode ser resolvido simplesmente com um str_replace.