Preg_Replace – Dissecando PHP
A função preg_replace do php é uma função de substituição como a str_replace mas com algumas diferenças, ela suporta expressões regulares e outros recursos mais poderosos. Preg_replace pode ser utilizada para fazer substituições ou mesmo para adicionar caracteres de posições específicas em um determinado texto.
A sintaxe da função preg_replace é a seguinte:
preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
O primeiro parâmetro é a expressão regular ou array de expressões regulares, para mais detalhes sobre expressões regulares veja esse post Dissecando Expressões Regulares no PHP. O segundo parâmetro é o conteúdo que será usado para substituição, pode ser um array também, mais abaixo ainda nesse artigo veremos mais detalhes sobre esse parâmetro. O terceiro parâmetro é o texto ou string a ser editado, também pode ser um array. O quarto parâmetro é um inteiro que indica o número máximo de substituições, esse parâmetro é opcional, o padrão é -1, ou seja sem limites. Há ainda um quinto parâmetro que deve ser uma variável que irá guardar a quantidade de substituições ou iterações que ocorreram durante a execução da função; esse último parâmetro também é opcional.
Achou complicado? Fique tranquilo que na prática é muito simples, veja os exemplos abaixo e vai entender como as coisas funcionam, mas antes note que iremos fazer alguns tratamentos com emails; na prática muitos sistemas modificam os emails para evitar spammers, portanto veremos algumas possíveis idéias utilizando preg_replace.
Exemplo Preg_Replace 01:
Nesse exemplo vamos substituir a segunda parte do email após o arroba @ por três pontos (…), veja como ficaria:
$text = "Entre em contato comigo no email my.email@profissionais.ws ou no email seductor.in@gmail.com, eu irei responder vc quando eu puder mas ja agradeco pelo contato";
$text = preg_replace('/@([-\.0-9a-zA-Z]+)/','@...',$text);
echo $text;
A saída do script acima será “Entre em contato comigo no email my.email@… ou no email seductor.in@…, eu irei responder vc quando eu puder mas ja agradeco pelo contato”. Ou seja, substituímos o domínio por três pontos (…).
Exemplo Preg_Replace 02:
Agora nossa missão é substituir o arroba @ por isso “( at )”, inclusive vocês já devem ter visto essa substituição em alguns sites, não é mesmo? Vejam como ficaria:
$text = preg_replace('/@/','( at )',$text);
echo $text;
Exemplo Preg_Replace 03:
Agora vamos extrapolar um pouco, vamos supor que você quer duplicar os emails, para isso você vai precisar utilizar duas barras invertidas seguido do número do conjunto de expressões regulares. Veja o exemplo para entender:
$text = preg_replace('/([-\.0-9a-zA-Z]+)@([-\.0-9a-zA-Z]+)/','\\1@\\2,\\1@\\2',$text);
echo $text;
Víram como é simples? Um conjunto de expressões é definido pelos parênteses, logo nós temos dois conjuntos, para você ter acesso aos valores que casaram em cada conjunto, basta informar o número do conjunto após duas barras invertidas. Mas você também pode utilizar invés de barras o símbolo ${1}, essa notação é mais interessante porque resolve alguns problemas. Por exemplo imagine que você queira pegar o primeiro conjunto que casou na expressão regular e colocar o número 1 logo após, se você fizer isso \\11, a função vai entender que você quer pegar o valor do conjunto 11, e não o valor do conjunto 1 e colocar o número um em seguida. Entenderam? Já com a outra notação nós podemos fazer isso de forma fácil. No exemplo abaixo vamos utilizar a notação ${1}.
Exemplo Preg_Replace 04:
Nesse exemplo vamos informar o limite para 1, ou seja, o segundo email do texto não será afetado. Vejam:
$text = preg_replace('/([-\.0-9a-zA-Z]+)@([-\.0-9a-zA-Z]+)/','${1}1@${2}',$text,1);
echo $text;
A saída do script acima será: “Entre em contato comigo no email my.email1@profissionais.ws ou no email seductor.in@gmail.com, eu irei responder vc quando eu puder mas ja agradeco pelo contato”. Notaram que o segundo email ficou intocado, e foi inserido o número 1 antes do arroba?
Exemplo Preg_Replace 05:
Para encerrar este artigo, vamos fazer um exemplo que utilize o último parâmetro da função preg_replace, lembrando que a função dele é guardar em uma variável o número casamentos que ocorreram. Vejam:
$text = preg_replace('/([-\.0-9a-zA-Z]+)@([-\.0-9a-zA-Z]+)/','${1}1@${2}',$text,-1,$total);
echo "<br>". $total;
A saída do script acima será 2, ou seja, houveram dois casamentos no texto informado. Um detalhe é que no parâmetro limite eu coloquei o valor -1, esse valor informa que não é para considerar nenhum limite, visto que a intensão é somar todos os casamentos.
Ah, não vimos um exemplo com arrays, então vamos, e dessa vez de verdade, finalizar com um exemplo usando arrays.
$pattern = array();
$pattern[] = '/([-\.0-9a-zA-Z]+)@profissionais.ws/';
$pattern[] = '/([-\.0-9a-zA-Z]+)@([^profissionais.ws][-\.0-9a-zA-Z]+)/';
$replace = array();
$replace[] = '${1}@...da-casa...';
$replace[] = '${1}@...outro...';
$text = preg_replace($pattern,$replace,$text);
echo $text;
A saída do script acima será “Entre em contato comigo no email my.email@…da-casa… ou no email seductor.in@…outro…, eu irei responder vc quando eu puder mas ja agradeco pelo contato”. Ou seja, se o domínio do email for “profissionais.ws” o script substitui por “…da-casa…” caso contrário irá substituir o domínio por “…outro…”
Espero que esse artigo seja esclarecedor para todos que estão estudando php e suas funções. Nos vemos no próximo artigo.
Take Care!







Sofrii… POGUEI pro str_replace() msmo, estava querendo complicar uma solução que podia ser, e foi, simples… mas vlw, essa idéia de acesso a blocos (${x}) na string de substituição eu tinha esquecido… grande utilidade!
20/10