Substituição de Strings em PHP

Artigo que apresenta algumas funções úteis do PHP para manipulação de strings, de acordo com o propósito desejado.

Substituição de strings é uma operação muito comum, mas nem sempre feita de forma adequada por todos programadores. Existem várias funções que podem ser usadas para isso e cada uma possui características próprias.

A função mais simples é str_replace, além de sua versão case-insensitive str_ireplace. Ela serve para substituir todas ocorrências de uma sequência de caracteres por outra, dentro de uma string.

$str = 'Frase de exemplo com exemplo simples';

// Trocando todas ocorrencias de "exemplo" por "teste"
$str2 = str_replace('exemplo', 'teste', $str);

Porém, quando deseja-se substituir várias sequências de caracteres por outras de uma só vez, pode ser mais útil utilizar a função passando dois arrays (um com as sequências a serem buscadas e outro com as sequências usadas para substituir):

$str = 'Frase de exemplo com exemplo simples';

// Trocando ocorrencias de "exemplo" por "teste", e "Frase" por "Texto"
$antes = array('exemplo', 'Frase');
$depois = array('teste', 'Texto');
$str2 = str_replace($antes, $depois, $str);

A vantagem de se utilizar o array ao invés de chamar str_replace duas vezes é que a string só precisa ser percorrida uma única vez, melhorando a performance.

// Caso 1
$str = 'abc';
$str = str_replace('a', 'b', $str); // "abc" vira "bbc"
$str = str_replace('b', 'a', $str); // "bbc" vira "aac"
echo $str;

// Caso 2
$str = 'abc';
$str = str_replace(array('a', 'b'), array('b', 'a'), $str); // "abc" vira "aac", mas em menor tempo
echo $str;

A função strtr tem funcionamento semelhante, mas pode ser usada passando-se um array associativo com chaves e valores que serão substituídas. A diferença é que strt não substitui um termo que já foi substituído.

$str = 'abc';

$substituicao = array(
    'a' => 'b',
    'b' => 'a'
);
$str = strtr($str, $substituicao); // "abc" vira "bac"

Já a função preg_replace é mais sofisticada, pois permite substituir sequências baseadas em expressões regulares. Normalmente ela deve ser utilizada quando não for possível utilizar as funções acima diretamente, ou quando a expressão regular só deseja determinar uma sequência de caracteres pelo tamanho (neste caso, é possível usar a função substr para obter as substrings desejadas e substituir aquela desejada).

$str = 'Hoje é 9 de janeiro de 2011';

// Trocando todos os numeros pela palavra "número"
$str = preg_replace('/\d+/', 'número', $str);

// Resultado: "Hoje é número de janeiro de número"

Também é possível utilizar parte da expressão capturada para montar a string de substituição:

$str = 'Hoje é 9 de janeiro de 2011';

$str = preg_replace('/(\d+)/', 'número (${1})', $str);

// Resultado: "Hoje é número (9) de janeiro de número (2011)"

E uma variante mais complexa que preg_replace é preg_replace_callback. Ela é capaz de aplicar uma função sobre os elementos capturados pela expressão regular. Ou seja, ela recebe por parâmetro um array com os elementos capturados (assim como funciona com a função preg_match), pode fazer modificações nestes elementos, e retornar uma string que será usada para substituição.

$str = 'Esta frase é "apenas" um "teste"';

function meu_filtro($elementos) {
    return strtoupper($elementos[1]);
}

// Convertendo tudo que está entre aspas duplas por maiúsculas
$str = preg_replace_callback('/("[^"]+")/', 'meu_filtro', $str);

// Resultado: Esta frase é "APENAS" um "TESTE"

8 comentários

Paulo disse...

Primeira explicação decente que vi sobre o preg_replace_callback . Parabéns blogger/programador, você é fera!

Anônimo disse...

$str = str_replace(array('a', 'b'), array('b', 'a'), $str); // "abc" vira "bac" está incorreto, resultado final vira aac