W3docs

Validación de Formularios PHP: Entradas de URL y Correo Electrónico

Aprende a validar entradas de correo electrónico y URL en PHP con filter_var y expresiones regulares, con ejemplos prácticos y buenas recomendaciones.

El correo electrónico y la URL son dos de los campos más comunes en cualquier formulario web, y también son dos de los más fáciles de ingresar incorrectamente. Un error tipográfico como user@example (sin el dominio de nivel superior) o example.com (una URL sin esquema) pasará una comprobación simple de "¿no está vacío?" pero fallará en el momento en que la aplicación intente enviar un mensaje o seguir el enlace.

Este capítulo muestra cómo validar entradas de correo electrónico y URL en PHP — confirmando que un valor tiene la forma esperada antes de almacenarlo o usarlo. La validación es un paso dentro de un flujo más amplio que también incluye recopilar los datos de $_POST/$_GET, recortarlos y sanearlo; consulta PHP Form Handling y PHP Form Validation para ver el panorama completo.

Cubrimos dos enfoques: la función incorporada filter_var (recomendada) y las expresiones regulares (útiles de entender, en ocasiones necesarias para reglas personalizadas).

Validación de Entradas de Correo Electrónico

La manera más limpia de validar una dirección de correo electrónico en PHP es la función filter_var con el filtro FILTER_VALIDATE_EMAIL. Devuelve el valor filtrado si la cadena parece un correo válido, y false si no lo es — por lo que se combina naturalmente con una comprobación if:

php— editable, runs on the server

Dado que filter_var devuelve false (no null) para entradas inválidas, compara siempre con el operador suelto ! o estricto === false. Un error común es escribir if (filter_var($email, FILTER_VALIDATE_EMAIL) == false) para una dirección como 0, lo cual está bien aquí, pero en general prefiere === false para evitar las sorpresas de comparación suelta de PHP.

Validación de Correo Electrónico con una Expresión Regular

También puedes validar un correo electrónico con una expresión regular — un patrón que describe qué cadenas están permitidas — usando preg_match. Vale la pena conocerlo, pero úsalo solo cuando necesites una regla que filter_var no pueda expresar (por ejemplo, restringir a un único dominio corporativo):

php— editable, runs on the server

Nota: Prefiere FILTER_VALIDATE_EMAIL sobre una regex escrita a mano en producción. La especificación completa de correo electrónico (RFC 5322) es notoriamente difícil de representar con un único patrón, y la regex anterior rechazará direcciones perfectamente válidas como dominios de nivel superior largos (.museum) o direcciones con etiqueta + ([email protected]). Consulta PHP Regular Expressions si quieres profundizar en la sintaxis de patrones.

Validación de Entradas de URL

Las URL se validan de la misma manera, con filter_var y el filtro FILTER_VALIDATE_URL. Un detalle importante: el filtro requiere un esquema (http://, https://, ftp://, …). Un example.com o www.example.com simple se reporta como inválido, así que decide de antemano si tu formulario espera que los usuarios escriban el prefijo https://.

php— editable, runs on the server

FILTER_VALIDATE_URL acepta marcas adicionales para endurecer la regla — por ejemplo, FILTER_FLAG_PATH_REQUIRED (la URL debe contener una ruta después del host) o FILTER_FLAG_QUERY_REQUIRED (debe contener una cadena 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";
  }
?>

Validación de URL con una Expresión Regular

Al igual que con el correo electrónico, puedes hacer coincidir una URL con una expresión regular. El patrón a continuación es permisivo y debe tratarse más como un recurso de aprendizaje que como una regla de producción:

php— editable, runs on the server

Nota: Para correo electrónico y URL, los filtros incorporados de filter_var son la opción recomendada. Se mantienen junto con PHP, cubren casos extremos que la regex pasa por alto y son mucho más claros en tu código.

Integrando Todo en un Formulario

En un formulario real no trabajas con cadenas escritas directamente — lees los valores enviados desde el superglobal $_POST, los recortas y reúnes los errores para mostrarlos todos a la vez. Este ejemplo valida un correo electrónico requerido y un sitio web 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);
  }
?>

El operador de fusión nula ?? "" evita una advertencia cuando el campo no está presente, y la comprobación $website !== "" hace que la URL sea opcional. Este es el mismo patrón usado en PHP Form Required Fields.

Validación vs. Saneamiento

La validación responde a "¿tiene este valor la forma correcta?" — no elimina ni escapa caracteres peligrosos. El saneamiento hace eso. PHP expone filtros de saneamiento como FILTER_SANITIZE_EMAIL, que elimina los caracteres que no están permitidos en una dirección de correo electrónico:

<?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";
  }
?>

Aquí el saneamiento convierte user(at)example.com en useratexample.com, que luego falla la validación — exactamente el resultado correcto, ya que el original no era una dirección real. Como regla general: valida para aceptar o rechazar, sanea antes de la salida, y nunca confíes en la entrada de un formulario. Para escapar datos antes de insertarlos en HTML o en una base de datos, consulta htmlspecialchars y mysqli::real_escape_string.

Resumen

  • Usa filter_var($value, FILTER_VALIDATE_EMAIL) y filter_var($value, FILTER_VALIDATE_URL) para una validación confiable y legible.
  • FILTER_VALIDATE_URL requiere un esquema como https://; añade marcas como FILTER_FLAG_PATH_REQUIRED para endurecer la regla.
  • Las expresiones regulares también pueden validar estos formatos, pero son fáciles de escribir mal — prefiere los filtros incorporados.
  • La validación y el saneamiento son tareas diferentes; usa ambos y trata todos los datos enviados como no confiables.

Práctica

Práctica
¿Cuáles de las siguientes afirmaciones sobre formularios PHP, URL y correo electrónico son correctas?
¿Cuáles de las siguientes afirmaciones sobre formularios PHP, URL y correo electrónico son correctas?
Was this page helpful?