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"
7 comentários
Primeira explicação decente que vi sobre o preg_replace_callback . Parabéns blogger/programador, você é fera!
Parabéns, ajudou-me a entender melhor a funçãodo prag_replace_callback
$str = str_replace(array('a', 'b'), array('b', 'a'), $str); // "abc" vira "bac" está incorreto, resultado final vira aac
Anônimo, tem razão. Removi o exemplo.
Muito obrigado por compartilhar esse excelente conteúdo. Me ajudou muito!
(y) top
obrigado
Postar um comentário
Nota: fique a vontade para expressar o que achou deste artigo ou do blog.
Dica: para acompanhar as respostas, acesse com uma conta do Google e marque a opção "Notifique-me".
Atenção: o blogger não permite inclusão de tags nos comentários, por isso, use algum site externo para postar seu código com dúvidas e deixe o link aqui. Exemplo: pastebin.com