Validação Regex em Php

A validação é uma preocupação comum para webmasters em todos os lugares. Se alguém está inserindo informações em seu formulário, você precisa validá-lo! Mas qual é a maneira mais simples de fazer isso? Bem, sempre que estou lidando com grandes quantidades de padrões de texto que precisam ser seguidos, sempre recorro às Expressões regulares. Expressões regulares são uma forma de seguir um padrão que você define.

Embora eu não vá ensinar Regex, vou falar sobre Regex em PHP. PHP usa predominantemente o sabor do Regex que o Perl faz. É por isso que a função para realizar uma expressão regular no PHP é preg_match. Executar uma correspondência de expressão regular PERL, entendeu? De qualquer forma, existem certos modificadores que podem ser adicionados ao padrão no PHP para afetar seu desempenho.

Por exemplo, adicionar “i” torna insensível a maiúsculas e minúsculas. Eu tive que fazer isso para o padrão de endereço de email, porque ele encurta o padrão regex para legibilidade, supondo que você o use sem distinção entre maiúsculas e minúsculas. Em seguida, há o modificador “m” que tratará um assunto de múltiplas linhas como, na verdade, de múltiplas linhas. Caso contrário, novas linhas (n) são ignoradas e as âncoras (^ e $) assumirão que você quer dizer o início e o fim de todo o assunto. “s” é útil se você estiver usando constantemente um padrão regex que não começa com ^ e não tem um caractere inicial consistente.

Para determinar se o nome de usuário, a senha e a senha de verificação estão corretos, presumo que apenas caracteres alfanuméricos sejam permitidos. Portanto, em vez de procurar por tudo o que poderia ser um caractere potencialmente errado, procuro por caracteres que não sejam alfanuméricos. Isso é indicado pelo caractere ^ na classe de caracteres [^ A-Za-z0-9]. Então, mais tarde, se houver correspondência, eu sei que há um caractere inválido no campo.

Lembre-se também de que existem metacaracteres que precisam de escape no regex. Eu recomendo preg_quote para isso.

Os valores de email e URL são mais difíceis, especialmente porque esses são padrões difíceis de definir. Por exemplo, em regular-expressions.info, um debate bastante extenso ocorreu no regex de e-mail. Tecnicamente, um endereço de e-mail válido pode conter apóstrofos. Para a maioria dos endereços de e-mail, o que está listado será válido. URLs contêm um problema semelhante. Os domínios de nível superior são numerosos e uma lista é difícil de agregar. As pessoas também têm a tendência de dizer apenas “abc.com” em vez de ” http://abc.com “. Também há situações em que o domínio de nível superior também contém um valor para o país, como “google.co.uk”.

Eu não posso aconselhar a tentar incluir tanto quanto você pode. Se você tentar atender a todos, acaba gastando tanto tempo na validação que não é mais viável. Valide a entrada do usuário de acordo com o que for conveniente em seu código, não de acordo com o que eles inserirão.

Além disso, regex não é a solução para todos os problemas (embora seja para a maioria). Se você está validando algo que tem muitas exceções ou é extremamente complicado, torna-se uma tarefa árdua. Não consigo nem imaginar tentar formatar datas e horas. É meio-dia ou meia-noite? 12:60 é válido? Que tal 17:00? Você exige que AM e PM sejam inseridos? 3 significa o mesmo que 3:00? É melhor deixar essas coisas para os humanos ou algum outro método que você possa inventar.

<? php

$ un = $ POST [“usuário”];
$ pw = $
POST [“passar”];
$ pw2 = $ POST [“pass2”];
$ em = $
POST [“email”];
$ url = $ _POST [“url”];

$ info = array ($ un, $ pw, $ pw2, $ em, $ url);

foreach ($ info as $ idx => $ unit) {
switch ($ idx) {
case 4:
$ rgx = “/ ^ ((ftp | http | https): // (w +: {0,1} w * @ )?)? (S +) (: [0-9] +)? (/ | / ([W #!:.? + = &% @! – /]))? $ / “;
quebrar;

        case 3:
$rgx
= "/^[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}$/i";
break;

case 2:
//read below
$rgx
= "/[^A-Za-z0-9]+/";
break;

case 1:
//read below
$rgx
= "/[^A-Za-z0-9]+/";
break;

case 0:
//if characters are NOT normal
$rgx
= "/[^A-Za-z0-9]+/";
break;

default:
echo
"???";
die("$unit ?");
break;
}

$n
= preg_match($rgx, $unit, $matches);
if ( ($idx == 0) || ($idx == 1) || ($idx == 2) ){
if ($n) {
echo
"Bad Characters in $unit; Alphanumeric only";
}
} else {
if ($n == 0) {
echo
"Incorrect Format in $unit; Enter Valid Info";
}
}

}

?>