+7

Utilizando Regex para verificação de campos de formulário

criado por Erika Focke em 25/10/2003 9:46pm
Utilizando Regex(regular expressions) para verificação de campos de formulário

É muito importante realizar uma verificação nos campos de formulário, não apenas para evitar o envio de dados errados, mas principalmente para aumentar a segurança na hora de lidar com bancos de dados.

Para tanto, utilizaremos Regular expressions, ou REGEX, uma expressão especificada pelo programador que conterá os caracteres válidos ou não para determinado campo.

Isso é muito importante principalmente nos campos de senha, pois há casos onde no campo senha uma pessoa mal-intencionada poderá realizar uma pesquisa mysql para retornar a senha de determinado usuario.
Por exemplo, por que não fazer:

usuário: |_fulano______|
senha: |_'mysql_query("select senha from usuarios where login='fulano' ")'____|

Em um código feito por um programador relapso, essa query pode funcionar perfeitamente.

Para evitar essas falhas de segurança, devemos fazer uso das funções de regex.

São elas:

ereg() -> Verifica se a variável bate com a expressão regular, case sensitive

ereg_replace() -> Repõe uma variável por uma expressão regular, case sensitive

eregi() -> Verifica se a variável bate com a expressão regular, case insensitive

eregi_replace() -> Repõe uma variável por uma expressão regular, case insensitive

split() -> Divide uma variável em array usando uma expressão regular como delimitador, case sensitive

spliti() -> Divide uma variável em array usando uma expressão regular como delimitador, case insensitive


Para fazermos a verificação no formulário, as funções comumente utilizadas são ereg() e eregi()

Formando Expressões

^ Início de uma linha
$ Final de uma linha
n? Zero ou apenas uma ocorrência do caracter 'n'
n* Zero ou mais ocorrências do caracter 'n'
n+ Pelo menos uma ou mais ocorrências do caracter 'n'
n{2} Exatamente duas ocorrências do caracter 'n'
n{2,} Pelo menos 2 ou mais ocorrências do caracter 'n'
n{2,4} De 2 a 4 ocorrências do caracter 'n'
. Qualquer caracter
() Parênteses para expressões grupais
(.*) Zero ou mais ocorrências de qualquer caracter
(n|a) Ou 'n', ou 'a'
[1-6] Qualquer digito compreendido entre 1 e 6
[c-h] Qualquer letra minúscula compreendida entre 'c' e 'h'
[D-M] Qualquer letra maiúscula compreendida entre 'D' e 'M'
[^a-z] Qualquer caracter EXCETO qualquer letra minúscula entre 'a' e 'z'.


Importante: O símbolo '^' só é tido como excessão de uma sequência se ele vier exatamente no início da sequência especificada. Se ele vier no início da expressão de regex(fora dos parênteses ou colchetes de expressões), ele será interpretado como "início de linha", e não como termo de negação. E se ele vier no meio de uma sequência, será interpretado como parte da mesma.

Exemplos:

[^0-9] -> Qualquer caracter exceto digitos de 0 a 9 (ou seja, apenas letras)

[53^a-z] -> Caracteres permitidos: 5, 3, ^, letras de 'a' a 'z'

^.{2} -> Quaisquer 2 caracteres no início da linha


FUNÇÃO EREG()

Sintaxe: ereg("expressao",$variavel)


Verificação de campo de e-mail

<?php
if(! ereg("^([0-9,a-z,A-Z]+)([.,_,-]([0-9,a-z,A-Z]+))*[@]([0-9,a-z,A-Z]+)([.,_,-]([0-9,a-z,A-Z]+))*[.]([a-z,A-Z]){2,3}([0-9,a-z,A-Z])?$", $input_email ) ) {
    echo "Caracteres Inválidos no campo de e-mail!!!";
}
?>


Explicando a expressão:

^([0-9,a-z,A-Z]+) -> No início da linha, pelo menos uma ou mais ocorrências dos caracteres de 0-9, ou a-z, ou A-Z

([.,_,-]([0-9,a-z,A-Z]+))* -> Seguidos ou não (Zero ou mais ocorrências) da expressão: ponto ou underline ou hifen seguidos de caracteres de 0-9, a-z ou A-Z que apareçam pelo menos uma vez ou mais

[@] -> seguido de arroba


([0-9,a-z,A-Z]+) -> seguidos de pelo menos um ou mais caracteres de 0-9, ou a-z, ou A-Z

([.,_,-]([0-9,a-z,A-Z]+))* -> Seguidos ou não(zero ou mais ocorrências) da expressão: ponto ou underline ou hifen seguidos de caracteres de 0-9, a-z ou A-Z que apareçam pelo menos uma vez ou mais

[.] -> seguidos de ponto

([0-9,a-z,A-Z]){2,3} -> Seguidos de 2 a 3 ocorrências de caracteres a-z ou A-Z

([a-z,A-Z])?$ -> Seguidos de uma ou nenhuma ocorrência de caracteres de a-z ou A-Z, no final da linha


A expressão ereg foi precedida de um '!' para retornar se valor contrário, ou seja, se a variável $input_email não coincidir com a expressão especificada, ele executa o comando echo "caracteres inválidos...";

Essa expressão aceita e-mails com pontos, underlines e hifens.


A partir desse exemplo fica fácil criar outras expressões mais simples, como para verificar o campo de senha:

<?php
if (!ereg("^([A-Z,a-z,0-9,_,-]){4,}", $senha) ) {
    echo "Senha com caracteres inválidos";
}
?>

Nesse caso a expressão aceitará caracteres de A-Z, a-z, 0-9, underline e hifen.

Comentários:

Mostrando 1 - 10 de 30 comentários
Erika

Não sou muito de escrever comentarios, mais tenho que dar os parabens pelo artigo, estou entrando na area agora e aprendi muito sobre ERs, e gostaria tambem de pedir que você escrevesse mais tutoriais sobre ERs, pois no banco de dados do phpbrasil.com so existe um tutorial falando sobre ERs, se for possivel faça outro com mais detalhes agradeço desde já
23/03/2006 10:19am (~19 anos atrás)

Mauricio Pena disse:
Marcelo,

tente assim:

if(ereg("^[^a-z,A-Z]{6,9}$", $passen) ) {
19/01/2006 10:19am (~19 anos atrás)

não estou conseguindo deixar o campo com um valor máximo, minha linha:

if(ereg("([^a-z,A-Z]){6,}", $passen) ) {

como faço pra deixar a variável $passen com valor máximo de digamos... 9 caracteres?


tentei assim e naum funcionou:
if(ereg("([^a-z,A-Z]){6,9}", $passen) ) {
06/01/2006 4:36am (~19 anos atrás)

ow erika, parabens pelo artigo, vc é mto bonita :)
06/03/2005 9:40pm (~20 anos atrás)

não consigoe xplicar pk, mas encontrei um bug.. na expressao regular ke controla a password..
exprimentem meter uma password como "teste'".

O problema é ke a aspa simples kuando colucada no fim da string é aceite.. o mesmo acontece c o espaço..
alguma sugestao?
29/04/2004 4:27pm (~20 anos atrás)

Erika,

Existe um erro na ER. Se permitirmos números no último bloco da mesma, permitimos que TDL's invélidos sejam aceitos, tais como uk1, ws1, tv1 e assim por diante.

Pelo ICANN não existem domínios TDL's com números.

Abraços
14/02/2004 7:58am (~21 anos atrás)

marcio disse:
devo confessar que já conhecia o reg, mas não tinha intendido bem na época pois estava começando com o php...
e esse artigo tão bem mostrado por nossa linda colega, fez com que a ficha terminasse de cair...
beijos para as mulheres do site e abraços aos manos...

Marcio
27/11/2003 7:03pm (~21 anos atrás)

tri legal...me foi de grande auxílio...parabéns...
07/11/2003 12:49pm (~21 anos atrás)

geralmente não cara..

se você fizer uma lista negada com os caracteres que você nao quer em uma única E.R já valida tudo.. seus dados serão aceitos no else por exemplo..
06/11/2003 9:00pm (~21 anos atrás)

... disse:
bom o artigo, mas se eu quiser validar por exemplo, alguns caracters TEM que ter, e outros não necessariamente, tem que usar dois ereg() ?
03/11/2003 6:08pm (~21 anos atrás)

Novo Comentário:

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