+1

Expressões regulares em PHP

criado por Roberto Bertó em 07/12/2000 12:00pm
Muitos programadores escrevem códigos gigantescos para tarefas que poderiam serem reduzidas a, talvez, uma linha. Quando você precisa realizar tarefas de procura e substituição dentro de strings nada melhor do que utilizar as ditas expressões regulares.

O PHP nos proporciona três formas de busca/substituição dentro de strings. A primeira delas é com as Strings functions (http://php.net/manual/ref.strings.php). Caso você nao queira aprender o formato das expressões regulares e queira escrever dezenas de scripts confusos, este é o seu caminho. Os outros dois são as Expressões Regulares padrão POSIX e as de padrão PERL.

Independentemente do caminho que você for adotar cada bloco de funções poderá fazer as mesmas coisas. Porém eu irei ensinar alguma coisa a respeito das Expressões Regulares compativeis com o PERL. Antes de vir ao PHP eu criava CGIs com PERL :)

Considere que este artigo não visa explicar como se cria a expressão regular em si, mas sim, explica como se usar expressões regulares com o PHP.

Os programadores utilizam de expressões regulares para os mais variados propósitos. Um deles é verificar se uma string contem um conjunto de caracteres dispostos de uma certa maneira. Por exemplo:

EXEMPLO 1:
<h><?PHP
$tem_tags = 'esta string contem tags, ok?';
$sem_tags = 'esta string NAO contem tags';

if (preg_match("/<.*?>/", $tem_tags)) {
print "a string '$tem_tags' POSSUI tags<br>";
}
else {
print "a string '$tem_tags' NÃO POSSUI tags<br>";
}

if (preg_match("/<.*?>/", $sem_tags)) {
print "a string '$sem_tags' POSSUI tags<br>";
}
else {
print "a string '$sem_tags' NÃO POSSUI tags<br>";
}
?></h>

Executando o script acima você verá que ele irá retornar que a variável $tem_tags realmente tem tags e a $sem_tags não possui. Esse tipo de verificação é usada muitas vezes para verificar se endereços de email e/ou URLs são válidos.

Outra grande utilidade de expressões regulares é retornar uma parte de uma string. Vou demonstrar como retornar tudo o que esta em negrito, certo?

EXEMPLO 2:
<h><?PHP
$negrito = 'fora do negrito 1 esta string contem tags fora do negrito 2';

if (preg_match("/(.*?)<.*?>(.*?)<\/b>(.*)/", $negrito, $p)) {
print "Na string '$p[0]'<br>antes: $p[1]<br>durante: $p[2]<br>depois: $p[3]<br>";
}
?></h>

Os usos dessa utilidade de eregs (expressões regulares) são infinitos. Sistemas de busca do tipo robots como o Altavista, Radar UOL, etc, devem usar eregs para pegar o título, descrição, keywords e etc das páginas que eles vasculham.

Agora vamos substituir com expressões regulares, que é um outro motivo muito bom para usarmos expressoes regulares. Digamos que você queira trocar o <h><title></h> de uma pagina por outro, só que em maiúsculo.

EXEMPLO 3
<h><?PHP
$pagina = '<html>
<head>
<title>Este é o título</title>
</head>
<body>Corpo</body></html>';

$nova_pagina = preg_replace("/<title>(.*?)<\/title>/e", "'novo título: ' . strtoupper('\\1')", $pagina);

print htmlentities($nova_pagina);
?></h>


Agora vamos às explicações dos exemplos.

De acordo com o manual você descobrirá que o formato da função preg_match é:
int preg_match(string pattern, string subject, array [matches]);

int: diz que retorna 1 se é true ou 0 se é false.
string pattern: é a string de busca.
string subject: é onde você esta buscando
array [matches]: é onde o PHP irá retornar os resultados. Este array tem, por padrão, o array[0] que é onde o PHP retornará a string de onde ele encontrou.


Se tudo isso parece confuso basta olhar o EXEMPLO 2. Nele eu usei o $p[0] e você entenderá o que ele faz.


No EXEMPLO 1 eu usei o int que retorna TRUE se ele encontrou ou FALSE senao. Portanto, se o IF for TRUE ele imprime que a string foi encontrada.

O $p do EXEMPLO 2 não passa de um array no qual o PHP põe os resultados da busca, sendo que o $p[1] é o valor dentro do primeiro parênteses e o $p[2] é do segundo.

Já no EXEMPLO 3 eu usei o modificador /e para que o que eu ponha dentro dos "" da string de replace seja tratado como um codigo em perl. Portanto eu usei o \\1 que eh o mesmo que o $p[1] se fosse uma preg_match.

O formato de um preg_replace eh:
string preg_replace(string pattern, string alterar, string subject);

Onde o que muda é o string alterar que é o codigo a ser alterado.

Espero ter passado uns bons exemplos para que qualquer um possa converter suas expressões regulares para PHP. Volto a dizer que este não se trata de um artigo para iniciantes em eregs.

Mais informações:
http://php.net/manual/ref.strings.php
http://php.net/manual/function.strtoupper.php
http://php.net/manual/ref.pcre.php

Comentários:

Mostrando 1 - 3 de 3 comentários
Ao que pareçe pelo que vejo no teu código, está a ocorrer um erro por repetição de um operador 'repetition-operator ' , no seu código possui o operador '/' duas vezes.Colque esse operador apenas uma vez e teste o código
Irá funcionar.
A sua resposta está também respndida no meu site
http://onidesk.sytes.net
11/04/2005 1:52pm (~19 anos atrás)

Newton Wagner disse:
Olá cara!! espero que alguém me responda essa.. apesar do artigo ser antigo:

(.*?)

Estou usando isso na minha EREG, e está retornando erro:

"Warning: ereg_replace() [function.ereg-replace]: REG_BADRPT:repetition-operator operand invalid in C:\newton\pagina\teste2.php on line 8"

A Linha 8 é essa:
$news = ereg_replace("/<(.*?)>/", "blank", $noticia);

A lógica da ER aí pode parecer errada, mas na verdade eu estava testando o (.*?) que aqui não funciona! :(.
04/10/2004 3:18pm (~20 anos atrás)

Ótima iniciativa.
Expressões regulares são muito úteis. Como você mesmo mencionou, o artigo não é para iniciantes, mas poderia ser mais completo sobre o assunto. Mais artigos como esse deveriam ser postados aqui.
16/12/2003 10:47am (~21 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)