PHP - Expressões regulares

Novembro 2016


O que é uma expressão regular?


As expressões regulares são padrões criados com a ajuda do caractere ASCII para manipular strings, isto é, para encontrar as partes da cadeia correspondente ao modelo. Este sistema é retirado do sistema POSIX (um sistema operacional). Vários scripts no UNIX os utilizam (especialmente o Perl).


Na verdade este é um sistema muito engenhoso (e muito poderoso) para encontrar uma palavra ou frase (e muitas outras coisas, na verdade) em um texto, como o modelo que foi construído...

Construir uma expressão regular


As expressões regulares são usadas para encontrar ocorrências (isto é, uma sequência de caracteres correspondente ao que procuramos) através de uma série de caracteres especiais. A expressão regular em si é uma string com caracteres especiais e caracteres padrão...

Os símbolos ^ e $ indicam o início ou o fim de uma cadeia e permitem delimitá-la.

"^início": cadeia que começa por "início" 
"fim$": cadeia que se termine com "fim" 
"^cadeia$": cadeia que começa e se termina com "cadeia" 
"abc": cadeia com a cadeia "abc"

Os símbolos *, + e ?, respectivamente "zero ou vários", "um ou vários", "um ou nenhum", dão uma noção de número.
"abc+": cadeia com "ab" seguido de um ou vários "c" ("abc", "abcc" ...) 
"abc*": cadeia com "ab" seguido de zero ou vários "c" ("ab", "abc" ...) 
"abc?": cadeia com "ab" seguido de zero ou um "c" ("ab" ou "abc") 
"^abc+": cadeia começando com "ab" seguido de um ou vários "c" ("abc", "abcc" ...)


As chaves {X,Y} dão limites de número.

"abc{2}": cadeia com "ab" seguido de dois "c" ("abcc") 
"abc{2,}": cadeia com "ab" seguido de dois "c" ou mais ("abcc" etc..) 
"abc{2,4}": cadeia com "ab" seguido  de 2, 3 ou 4 "c" ("abcc" .. "abcccc")

Saiba que o primeiro número do limite ("{0,2}", mas não "{,2}") é obrigatório. Os símbolos vistos anteriormente ('*', '+', and '?') são equivalentes à "{0,}", "{1,}", e "{0,1}".

Os parênteses ( ) representam uma sequência de caracteres.

"a(bc)*": cadeia com "a" seguido de zero "bc" ou mais

A barra vertical | se comporta como operador OU
"um|o": cadeia com "um" ou "o" 
"(um|o) cão": cadeia com "um cão" ou "o cão" 
"(a|b)*": cadeia com uma sequência de "a" ou de "b"

O ponto . indica qualquer caractere (uma vez)
"^.{3}$": cadeia com 3 caracteres


Os colchetes [ ] definem uma lista de caracteres autorizados (ou proibidos). O sinal - define um intervalo. O caractere ^ após o primeiro colchete indica uma proibição.
"[abc]": cadeia com um "a", un "b", ou un "c" 

"[a-z]": cadeia com um caractere entre "a" e "z" 

"^[a-zA-Z]": cadeia que começa por uma letra 
"^[^a-zA-Z]": cadeia que não começa por uma letra


  • Para encontrar um caractere fazendo parte dos caracteres especiais, basta precedê-lo por uma barra invertida ( exceto entre colchetes )
  • Então, uma barra invertida deve ser o dobrada!

Na verdade, entre os colchetes, cada caractere representa o que ele é. Para representar um ] é preciso colocá-lo em primeiro (ou depois de um ^ se for uma proibição), um "-" deve ser colocado no começo ou no fim.
"[\+?{}.]": cadeia com um desses seis caracteres 
"[]-]": cadeia com o caractere "]" ou o caractere "-"


Veja um sumário dos caracteres especiais utilizados nas expressões regulares:


Caractere Utilidade
[] Os colchetes definem uma lista de caracteres autorizados
() Os parênteses definem um elemento composto da expressão regular que ele contém
{} As chaves, quando elas contêm um ou vários números separados por vírgulas, representam o número de vezes que o elemento que precede as chaves pode se repetir (por exemplo, p{3,5} corresponde à ppp, pppp ou ppppp
- Um menos entre dois caracteres em uma lista representa um intervalo (por exemplo [a-d] representa [abcd])
. O caractere ponto representa um caractere único
* O caractere asterisco indica a repetição indeterminada do elemento que o precede
? O caractere "ponto de interrogação" indica a presença eventual do elemento que o precede
bacon>porco)
^
  • Colocado no início da expressão ele significa "cadeia começando com..."
  • Utilizado dentro de uma lista ele significa "não contém os seguintes caracteres..."
$ Colocado no fim da expressão ele significa "cadeia terminando com..."




Classes de caracteres


Também pode ser útil verificar se uma string contém caracteres de um certo tipo (numérico, alfanumérico , etc) sem ter que listá-los. Para isso, as expressões regulares definem classes de caracteres, cuja sintaxe é:


[:classe:]


As classes de caracteres são aquelas definidas pelo UNIX. Veja uma tabela que resume algumas dessas classes:


Nome da classeDescrição
[:alnum:]caracteres alfanuméricos (equivalente à [A-Za-z0-9])
[:alfa:]caracteres alfabéticos ([A-Za-z])
[:blank:]caracteres brancos (espaço, tabulação)
[:ctrl:]caracteres de controle (os primeiros do código ASCII
[:digit:]chiffre ([0-9])
[:graph:]caractere de impressora (que faz uma marca na tela, de certa forma)
[:print:]caractere imprimível (que passa para a impressora... tudo exceto os caracteres de controle)
[:punct:]caractere de pontuação
[:space:]caractere de espaço
[:upper:]caractere maiúsculo
[:xdigit:]caractere hexadecimal

Aqui estão alguns exemplos de como usar classes de caracteres em uma expressão regular:

cadeia composta de um ou vários caracteres alfanuméricos

"^[:alnum:]+$"

cadeia com um caractere de pontuação ou um caractere de espaço
"[:punct:]|[:space:]"

Um número
"^[:digit:]+$"

Funções de manipulação de expressões regulares


PHP fornece algumas funções básicas para manipulação de strings utilizando expressões regulares.

As funções ereg() e eregi()


A funçãoereg() cuja assinatura é a seguinte:
Booleano ereg(cadeia modelo,cadeia de texto,[tabela de ocorrências])
avalia o texto transformado em argumento graças ao modelo (que é uma expressão regular) e armazena todas as ocorrências em uma tabela transformada, opcionalmente, em parâmetro. Quando a função localiza ocorrências, ela retorna true , caso contrário, ela retorna false .

A função eregi() cuja assinatura é a seguinte:
Booleano eregi(cadeia modelo,cadeia de texto,[tabela de ocorrências])
faz o mesmo trabalho que sua irmã ereg (), exceto que ela não é sensível ao tamanho da fonte (não diferencia as maiúsculas das minúsculas).

<? 
$fp = fopen("http://www.ccm.net","r"); //leitura do arquivo 
while (!feof($fp)) { //percorremos todas as linhas 
  $page .= fgets($fp, 4096); // leitura do conteúdo da linha 
} 

$título = eregi("<title>(.*)</title>",$page,$regs); //isolamos o título 
/* O título começa com <title>, 
e contém qualquer cadeia, 
e termina com </title> */ 
echo $regs[1]; // voltamos à primeira ocorrência encontrada  
// As ocorrências ficam entre parênteses 
// $regs[0] retorna a cadeia inteira 
fclose($fp); 

?>

As funções ereg_replace() e eregi_replace()


A função ereg_replace() cuja assinatura é a seguinte:
cadeia ereg_replace(cadeia modelo,cadeia de substituição,cadeia de texto)
Permite retornar à cadeia de texto transformada em argumento com as ocorrências encontradas substituídas pela cadeia de substituição.

Para usar as ocorrências correspondentes ao modelo na cadeia de substituição, é só usar parênteses na cadeia modelo e, assim, se referir a esses elementos na cadeia de substituição, utilizando duas barras invertidas seguidas de um número que identifique o elemento entre 0 e 9 (os números são dados por ordem de imbricamento, em seguida, da esquerda para a direita, o zero representa toda a cadeia).

O seguinte código substitui Toto por <b>Toti Toto</b>... inútil, mas formador.


$Texto = "Bem-vindo ao Toto no mundo das expressões regulares"; 

$Texto = ereg_replace("To(to)","<b>\\1ti \\0</b>",$Texto);


O seguinte código (uso avançado das expressões regulares) troca um URL por um hipertexto HTML (ele substitui, imediatamente, caracteres de pontuação e alfanuméricos começando com http://, ou ftp:// pelo mesmo texto (sem http://) entre as tags HTML de hipertexto...):


$Texto = "Bem-vindo ao http://www.ccm.net caro amigo"; 

$Texto = ereg_replace("(http://)((:punct:|:alnum:)*)", 
       "<a href=\"\\0\">\\2</a>",$Texte);


A função eregi_replace() cuja assinatura é a seguinte:
cadeiaeregi_replace(cadeia modelo,cadeia de substituição,cadeia de texto)

faz o mesmo trabalho que sua irmã ereg_replace(), exceto que ela não é sensível ao tamanho da fonte (não diferencia as maiúsculas das minúsculas).

A função split()


A função split() tem a seguinte sintaxe:

tabela split (cadeia de expressão, cadeia de texto [,limite total])

A função split() retorna uma tabela a partir de uma cadeia e de uma expressão regular. O limite, opcional, permite limitar o tamanho da tabela retornada. Neste caso, o último elemento da tabela contém o restante da cadeia. Se ocorrer um erro, split retorna o 0.
<? 
// corta uma frase em uma tabela de palavras 
// utilizamos split caso haja vários espaços entre as palavras 
$frase = "Esta é uma frase com três espaços aqui"; 
  

$tabela_palavras = split(" +",trim($frase)); // um espaço ou mais 
?>

A função sql_regcase()


A função sql_regcase() tem a seguinte sintaxe:

cadeia sql_regcase (cadeia de texto


Ela retorna uma expressão regular que representa a cadeia transformada em parâmetro, independentemente da fonte. Cada caractere da cadeia é representado entre colchetes, com dois caracteres, um em letra maiúscula e outro em letra minúsculas, ou então, duas vezes o mesmo caractere . Nenhuma explicação é melhor que bom exemplo):

<? 
echo sql_regcase("um teste"); 

// exibe [Uu][Nn][  ][Tt][Ee][Ss][Tt] 
?>

Este recurso permite gerar uma cadeia insensível ao tamanho da fonte, para as expressões regulares em bancos de dados, por exemplo. No MySQL, quando você usa a função REGEXP (em vez de LIKE) a busca é sensível ao tamanho da fonte. Assim, a solução é gerar uma cadeia não sensível ao tamanho da fonte com o sql_regcase.

<? 
$palavrachave = sql_regcase("palavrachave"); 

$sql = "SELECT * from table WHERE champ REGEXP \":<:$motclef:>:\""; 

// seleciona todos os backups da tabela "table", com a PALAVRA palavrachave 
?>



Tradução feita por Lucia Maurity y Nouira



Veja também :
Este documento, intitulado « PHP - Expressões regulares »a partir de CCM (br.ccm.net) está disponibilizado sob a licença Creative Commons. Você pode copiar, modificar cópias desta página, nas condições estipuladas pela licença, como esta nota aparece claramente.