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...
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
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 fim da expressão ele significa "cadeia terminando com..." |
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 classe | Descriçã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:]+$"
PHP fornece algumas funções básicas para manipulação de strings utilizando expressões regulares.
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); ?>
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() 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() 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 ?>