Validação de Formulários PHP: Entradas de URL e E-mail
Aprenda a validar entradas de e-mail e URL em PHP com filter_var e expressões regulares, garantindo dados corretos antes de armazená-los.
E-mail e URL são dois dos campos mais comuns em qualquer formulário web, e também são dois dos mais fáceis de errar. Um erro de digitação como user@example (sem o domínio de nível superior) ou example.com (uma URL sem esquema) passará por uma verificação simples de "não está vazio", mas falhará no momento em que sua aplicação tentar enviar uma mensagem ou seguir o link.
Este capítulo mostra como validar entradas de e-mail e URL em PHP — confirmando que um valor tem a forma esperada antes de armazená-lo ou usá-lo. A validação é uma etapa em um fluxo maior que também inclui coletar os dados de $_POST/$_GET, removendo espaços e sanitizando-os; consulte Manipulação de Formulários PHP e Validação de Formulários PHP para ver o quadro completo.
Abordamos duas abordagens: a função embutida filter_var (recomendada) e expressões regulares (útil de entender, ocasionalmente necessária para regras personalizadas).
Validando Entradas de E-mail
A maneira mais limpa de validar um endereço de e-mail em PHP é a função filter_var com o filtro FILTER_VALIDATE_EMAIL. Ela retorna o valor filtrado se a string se parece com um e-mail válido, e false se não — portanto, combina naturalmente com uma verificação if:
Como filter_var retorna false (não null) para entrada inválida, sempre compare com o ! solto ou o estrito === false. Um erro comum é escrever if (filter_var($email, FILTER_VALIDATE_EMAIL) == false) para um endereço como 0, o que está bem aqui, mas em geral prefira === false para evitar surpresas de comparação solta do PHP.
Validando E-mail com uma Expressão Regular
Você também pode validar um e-mail com uma expressão regular — um padrão que descreve quais strings são permitidas — usando preg_match. Vale conhecer, mas use-a apenas quando precisar de uma regra que filter_var não consegue expressar (por exemplo, restringir a um único domínio corporativo):
Nota: Prefira
FILTER_VALIDATE_EMAILem vez de uma regex escrita à mão em produção. A especificação completa de e-mail (RFC 5322) é notoriamente difícil de corresponder com um único padrão, e a regex acima rejeitará endereços perfeitamente válidos como domínios de nível superior longos (.museum) ou endereços com tag+([email protected]). Consulte Expressões Regulares PHP se quiser se aprofundar na sintaxe de padrões.
Validando Entradas de URL
URLs são validadas da mesma forma, com filter_var e o filtro FILTER_VALIDATE_URL. Um detalhe importante: o filtro requer um esquema (http://, https://, ftp://, …). Um example.com ou www.example.com simples é reportado como inválido, portanto decida antecipadamente se seu formulário espera que os usuários digitem o prefixo https://.
FILTER_VALIDATE_URL aceita flags extras para restringir a regra — por exemplo, FILTER_FLAG_PATH_REQUIRED (a URL deve conter um caminho após o host) ou FILTER_FLAG_QUERY_REQUIRED (deve conter uma string de consulta):
<?php
$url = "https://example.com/page?ref=newsletter";
if (filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_QUERY_REQUIRED)) {
echo "Valid URL with a query string";
} else {
echo "Missing or invalid query string";
}
?>Validando URL com uma Expressão Regular
Assim como com e-mail, você pode corresponder uma URL com uma expressão regular. O padrão abaixo é permissivo e melhor tratado como um auxílio de aprendizagem do que uma regra de produção:
Nota: Para e-mail e URL, os filtros embutidos do
filter_varsão a escolha recomendada. Eles são mantidos junto com o PHP, cobrem casos extremos que regex não cobre, e se leem com muito mais clareza no seu código.
Juntando Tudo em um Formulário
Em um formulário real, você não trabalha com strings codificadas — você lê os valores enviados do superglobal $_POST, remove os espaços e coleta quaisquer erros para exibi-los todos de uma vez. Este exemplo valida um e-mail obrigatório e um site opcional:
<?php
// Imagine these come from a submitted <form method="post">.
$email = trim($_POST["email"] ?? "");
$website = trim($_POST["website"] ?? "");
$errors = [];
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors[] = "Please enter a valid email address.";
}
// Website is optional: only validate it when something was typed.
if ($website !== "" && !filter_var($website, FILTER_VALIDATE_URL)) {
$errors[] = "Please enter a valid URL.";
}
if (empty($errors)) {
echo "All inputs are valid.";
} else {
echo implode("\n", $errors);
}
?>O operador de coalescência nula ?? "" evita um aviso quando o campo está ausente, e a verificação $website !== "" torna a URL opcional. Este é o mesmo padrão usado em Campos Obrigatórios em Formulários PHP.
Validação vs. Sanitização
A validação responde "este valor tem a forma correta?" — ela não remove nem escapa caracteres perigosos. A sanitização faz isso. O PHP expõe filtros de sanitização como FILTER_SANITIZE_EMAIL, que remove caracteres não permitidos em um endereço de e-mail:
<?php
$raw = "user(at)example.com";
$clean = filter_var($raw, FILTER_SANITIZE_EMAIL); // "useratexample.com"
if (filter_var($clean, FILTER_VALIDATE_EMAIL)) {
echo "Usable email: $clean";
} else {
echo "Could not produce a valid email";
}
?>Aqui a sanitização transforma user(at)example.com em useratexample.com, que então falha na validação — exatamente o resultado correto, já que o original não era um endereço real. Como regra: valide para aceitar ou rejeitar, sanitize antes da saída, e nunca confie em dados de um formulário. Para escapar dados antes de inseri-los em HTML ou em um banco de dados, consulte htmlspecialchars e mysqli::real_escape_string.
Resumo
- Use
filter_var($value, FILTER_VALIDATE_EMAIL)efilter_var($value, FILTER_VALIDATE_URL)para validação confiável e legível. FILTER_VALIDATE_URLrequer um esquema comohttps://; adicione flags comoFILTER_FLAG_PATH_REQUIREDpara restringir a regra.- Expressões regulares também podem validar esses formatos, mas são fáceis de errar — prefira os filtros embutidos.
- Validação e sanitização são tarefas diferentes; use ambas e trate todos os dados enviados como não confiáveis.