filter_var()
PHP ofrece funciones integradas para filtrar y validar datos de entrada. Una de ellas es filter_var(), usada para filtrar y sanear valores.
Introducción
filter_var() es la herramienta integrada de PHP para validar y sanear un único valor. Validar significa comprobar si un valor coincide con la forma esperada (un correo electrónico real, un entero dentro de un rango, una URL válida) y devolver el valor si es así, o false si no lo es. Sanear significa limpiar un valor eliminando o escapando los caracteres que no corresponden.
Nunca confíes en los datos que provienen del exterior de tu script: campos de formularios, cadenas de consulta, cookies, cargas útiles de API. Procesarlos con filter_var() antes de almacenarlos, mostrarlos o actuar sobre ellos es una de las formas más sencillas de mantener tu aplicación segura y predecible. Esta página cubre la sintaxis, los dos modos (validar vs. sanear), los filtros y marcadores más comunes, y los errores habituales que confunden a los desarrolladores.
Sintaxis
filter_var(mixed $value, int $filter = FILTER_DEFAULT, array|int $options = 0): mixed| Parámetro | Obligatorio | Descripción |
|---|---|---|
$value | sí | El valor a filtrar. |
$filter | no | El identificador del filtro a aplicar, p. ej. FILTER_VALIDATE_INT. Por defecto es FILTER_DEFAULT, que no aplica ningún filtro. |
$options | no | Un array asociativo de opciones/marcadores, o una constante de marcador individual, para ajustar el filtro. |
Valor de retorno: el valor filtrado (y posiblemente convertido) si tiene éxito, o false en caso de fallo. Ten en cuenta que un filtro de validación devuelve el propio valor, por lo que siempre debes comparar con === cuando el valor válido pueda ser falsy (como 0 o una cadena vacía).
Validación de datos
La validación responde una pregunta de sí/no: ¿es aceptable este valor? El filtro devuelve el valor si tiene éxito y false en caso de fallo.
Validar una dirección de correo electrónico
Los filtros de validación más útiles son:
| Filtro | Valida |
|---|---|
FILTER_VALIDATE_INT | Un entero (opcionalmente dentro de min_range/max_range). |
FILTER_VALIDATE_FLOAT | Un número de punto flotante. |
FILTER_VALIDATE_BOOLEAN | "1", "true", "on", "yes" → true; "0", "false", "off", "no", "" → false. |
FILTER_VALIDATE_EMAIL | Una dirección de correo electrónico. |
FILTER_VALIDATE_URL | Una URL. |
FILTER_VALIDATE_IP | Una dirección IPv4/IPv6. |
FILTER_VALIDATE_REGEXP | Un valor que coincide con un patrón PCRE. |
La trampa de === false
Dado que un filtro de validación devuelve el valor, un resultado de 0 o "0" es válido pero falsy. Usa siempre una comparación estricta:
Saneamiento de datos
El saneamiento no rechaza un valor, sino que lo limpia y devuelve la cadena saneada.
Sanear una dirección de correo electrónico
Filtros de saneamiento comunes:
| Filtro | Efecto |
|---|---|
FILTER_SANITIZE_EMAIL | Elimina los caracteres no permitidos en un correo electrónico. |
FILTER_SANITIZE_URL | Elimina los caracteres no permitidos en una URL. |
FILTER_SANITIZE_NUMBER_INT | Conserva dígitos y +/-. |
FILTER_SANITIZE_NUMBER_FLOAT | Conserva dígitos, +/-, y (con marcadores) .,e. |
FILTER_SANITIZE_SPECIAL_CHARS | Codifica en HTML <, >, &, " y otros. |
FILTER_SANITIZE_FULL_SPECIAL_CHARS | Similar a htmlspecialchars() con ENT_QUOTES. |
Nota:
FILTER_SANITIZE_STRINGfue declarado obsoleto en PHP 8.1. Para limpiar cadenas destinadas a salida HTML, es preferible usarhtmlspecialchars()en el momento de la visualización.
Uso de opciones y marcadores
El tercer argumento permite ajustar un filtro. Pásalo como un array con 'options' (y opcionalmente 'flags'):
Los marcadores también pueden pasarse directamente como tercer argumento cuando no necesitas la forma de array:
Validar vs. sanear — cuándo usar cada uno
- Valida cuando necesitas una decisión de sí/no: rechazar la petición, mostrar un error, reintentar. Usa filtros de validación para correos electrónicos, números, URLs e IPs en formularios y APIs.
- Sanea cuando debes aceptar la entrada pero quieres limpiarla de caracteres peligrosos o ajenos antes de usarla.
- Los dos son complementarios: un patrón habitual es validar en la entrada y escapar (p. ej. con
htmlspecialchars()) en la salida, en lugar de depender únicamente de los filtros de saneamiento.
Errores comunes
- Un filtro de validación devuelve el valor, no
true. Compara con=== falsepara detectar fallos. filter_var()opera sobre un único valor escalar. Para filtrar múltiples valores a la vez, usafilter_var_array()o, para datos de petición,filter_input_array().FILTER_VALIDATE_BOOLEANdevuelvenull(nofalse) para valores no reconocidos solo cuando se pasaFILTER_NULL_ON_FAILURE; en caso contrario devuelvefalse.- No confíes en los filtros de saneamiento para el escapado de salida crítico para la seguridad: escapa en el momento del renderizado.
Temas relacionados
filter_var_array()— filtra múltiples variables en una sola llamada.filter_input_array()— filtra datos de petición ($_GET,$_POST).- Validación de formularios PHP — aplicación de estos filtros en formularios reales.
- Validar URL y correo electrónico en PHP
htmlspecialchars()— escapado para salida HTML segura.trim()— eliminar espacios en blanco antes de filtrar.
Conclusión
filter_var() es una manera compacta y confiable de validar y sanear valores individuales en PHP. Recurre a los filtros de validación para aceptar o rechazar entradas, a los filtros de saneamiento para limpiarlas, y recuerda comparar los resultados de validación con === false. Combinada con filter_var_array() para datos masivos y htmlspecialchars() para la salida, forma la columna vertebral del manejo seguro de entradas.