⊗ppPmRgESCh 226 of 447 menu

Escapando caracteres especiais em expressões regulares do PHP

Suponha que queiramos que um caractere especial represente a si mesmo. Para isso, precisamos escapá-lo usando uma barra invertida. Vamos ver alguns exemplos.

Exemplo

No exemplo a seguir, o autor da expressão regular queria que o padrão de busca fosse: a letra 'a', seguida pelo sinal de mais '+', seguida pela letra 'x'. No entanto, o autor do código não escapou o caractere '+' e, portanto, o padrão de busca na verdade é: a letra 'a' uma ou mais vezes, depois a letra 'x':

<?php $str = 'a+x ax aax aaax'; $res = preg_replace('#a+x#', '!', $str); ?>

Como resultado, a variável conterá o seguinte:

'a+x ! ! !'

Exemplo

Agora, o autor escapou o sinal de mais com uma barra invertida. Agora o padrão de busca está como deveria: a letra 'a', seguida pelo sinal de mais '+', seguida pela letra 'x'.

<?php $str = 'a+x ax aax aaax'; $res = preg_replace('#a\+x#', '!', $str); ?>

Como resultado, a variável conterá o seguinte:

'! ax aax aaax'

Exemplo

Neste exemplo, o padrão é: a letra 'a', seguida pelo ponto '.', seguida pela letra 'x':

<?php $str = 'a.x abx azx'; $res = preg_replace('#a\.x#', '!', $str); ?>

Como resultado, a variável conterá o seguinte:

'! abx azx'

Exemplo

No exemplo a seguir, o autor esqueceu de escapar a barra e a expressão regular capturou todas as substrings, pois o ponto não escapado representa qualquer caractere:

<?php $str = 'a.x abx azx'; $res = preg_replace('#a.x#', '!', $str); ?>

Como resultado, a variável conterá o seguinte:

'! ! !'

Exemplo

Observe que se você se esquecer da barra invertida para o ponto (quando ele deve representar a si mesmo) - isso pode passar despercebido:

<?php preg_replace('#a.x#', '!', 'a.x'); // retornará '!', como esperado ?>

Visualmente funciona corretamente (já que o ponto representa qualquer caractere, inclusive o próprio ponto '.'). Mas se alterarmos a string onde as substituições ocorrem - veremos nosso erro:

<?php preg_replace('#a.x#', '!', 'a.x abx azx'); // retornará '! ! !', mas esperávamos '! abx azx' ?>
deituzples