Validación de Datos
Validar datos es fundamental para la seguridad y estabilidad de tu aplicacion. PHP incluye funciones de filtrado que facilitan validar emails, URLs, numeros y sanear texto.
¿Por qué validar?
Nunca confies en los datos que vienen del usuario. Pueden contener errores accidentales o intentos de ataque. La validacion verifica que los datos tienen el formato correcto.
filter_var para validar
filter_var() es la forma mas simple de validar datos comunes:
<?php
declare(strict_types=1);
// Validar email
$email = 'usuario@ejemplo.com';
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo 'Email valido';
} else {
echo 'Email invalido';
}
// Validar URL
$url = 'https://ejemplo.com';
if (filter_var($url, FILTER_VALIDATE_URL)) {
echo 'URL valida';
}
// Validar entero
$edad = '25';
if (filter_var($edad, FILTER_VALIDATE_INT) !== false) {
echo 'Numero valido';
}
Filtros de validación comunes
<?php
declare(strict_types=1);
// FILTER_VALIDATE_EMAIL - Email
filter_var('test@mail.com', FILTER_VALIDATE_EMAIL); // 'test@mail.com'
filter_var('invalido', FILTER_VALIDATE_EMAIL); // false
// FILTER_VALIDATE_URL - URL
filter_var('https://php.net', FILTER_VALIDATE_URL); // 'https://php.net'
// FILTER_VALIDATE_INT - Entero
filter_var('42', FILTER_VALIDATE_INT); // 42
filter_var('3.14', FILTER_VALIDATE_INT); // false
// FILTER_VALIDATE_FLOAT - Decimal
filter_var('3.14', FILTER_VALIDATE_FLOAT); // 3.14
// FILTER_VALIDATE_BOOLEAN - Booleano
filter_var('true', FILTER_VALIDATE_BOOLEAN); // true
filter_var('yes', FILTER_VALIDATE_BOOLEAN); // true
filter_var('1', FILTER_VALIDATE_BOOLEAN); // true
filter_var('false', FILTER_VALIDATE_BOOLEAN); // false
// FILTER_VALIDATE_IP - Direccion IP
filter_var('192.168.1.1', FILTER_VALIDATE_IP); // '192.168.1.1'
Validar con opciones
<?php
declare(strict_types=1);
// Validar entero en un rango
$opciones = [
'options' => [
'min_range' => 1,
'max_range' => 100,
],
];
$edad = 25;
if (filter_var($edad, FILTER_VALIDATE_INT, $opciones) !== false) {
echo 'Edad entre 1 y 100';
}
// Validar entero mayor que cero
$cantidad = 5;
$opciones = ['options' => ['min_range' => 1]];
if (filter_var($cantidad, FILTER_VALIDATE_INT, $opciones) !== false) {
echo 'Cantidad valida';
}
Sanear datos
Sanear (sanitize) significa limpiar los datos, eliminando caracteres no deseados:
<?php
declare(strict_types=1);
// Eliminar etiquetas HTML
$texto = '<script>alert("hack")</script>Hola';
$limpio = filter_var($texto, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
echo $limpio; // <script>...Hola
// Limpiar email (quita caracteres invalidos)
$email = 'usuario @ejemplo.com';
$limpio = filter_var($email, FILTER_SANITIZE_EMAIL);
echo $limpio; // usuario@ejemplo.com
// Limpiar URL
$url = 'https://ejemplo.com/pagina con espacios';
$limpio = filter_var($url, FILTER_SANITIZE_URL);
echo $limpio; // https://ejemplo.com/paginaconespacios
// Limpiar numero
$numero = '42abc';
$limpio = filter_var($numero, FILTER_SANITIZE_NUMBER_INT);
echo $limpio; // 42
htmlspecialchars para mostrar texto
Cuando muestras texto del usuario en HTML, usa
htmlspecialchars() para prevenir XSS:
<?php
declare(strict_types=1);
$comentario = '<script>alert("XSS")</script>';
// NUNCA hagas esto:
// echo $comentario;
// SIEMPRE escapar:
echo htmlspecialchars($comentario, ENT_QUOTES, 'UTF-8');
// Muestra: <script>alert("XSS")</script>
// Funcion helper comun
function escape(string $texto): string
{
return htmlspecialchars($texto, ENT_QUOTES, 'UTF-8');
}
echo escape($comentario);
Validar formulario completo
<?php
declare(strict_types=1);
function validarRegistro(array $datos): array
{
$errores = [];
// Validar nombre
$nombre = trim($datos['nombre'] ?? '');
if ($nombre === '') {
$errores['nombre'] = 'El nombre es obligatorio';
} elseif (strlen($nombre) < 2) {
$errores['nombre'] = 'El nombre es muy corto';
}
// Validar email
$email = trim($datos['email'] ?? '');
if ($email === '') {
$errores['email'] = 'El email es obligatorio';
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errores['email'] = 'El email no es valido';
}
// Validar edad
$edad = $datos['edad'] ?? '';
$opciones = ['options' => ['min_range' => 18, 'max_range' => 120]];
if (filter_var($edad, FILTER_VALIDATE_INT, $opciones) === false) {
$errores['edad'] = 'La edad debe ser entre 18 y 120';
}
return $errores;
}
// Uso
$datos = [
'nombre' => 'Ana',
'email' => 'ana@ejemplo.com',
'edad' => '25',
];
$errores = validarRegistro($datos);
if (empty($errores)) {
echo 'Datos validos';
} else {
foreach ($errores as $campo => $mensaje) {
echo "$campo: $mensaje" . PHP_EOL;
}
}
Funciones de validacion propias
<?php
declare(strict_types=1);
function esEmailValido(string $email): bool
{
return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}
function esTelefonoValido(string $telefono): bool
{
// Telefono español: 9 digitos, empieza por 6, 7 o 9
return preg_match('/^[679]\d{8}$/', $telefono) === 1;
}
function esPasswordSeguro(string $password): bool
{
// Minimo 8 caracteres, 1 mayuscula, 1 minuscula, 1 numero
return strlen($password) >= 8
&& preg_match('/[A-Z]/', $password)
&& preg_match('/[a-z]/', $password)
&& preg_match('/[0-9]/', $password);
}
// Uso
var_dump(esEmailValido('test@mail.com')); // true
var_dump(esTelefonoValido('612345678')); // true
var_dump(esPasswordSeguro('Abc12345')); // true
Ejercicios
Ejercicio 1: Validar email
Crea una funcion validarEmail(string $email): bool
que verifique si un email es valido usando filter_var().
Ver solucion
<?php
declare(strict_types=1);
function validarEmail(string $email): bool
{
return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}
var_dump(validarEmail('usuario@mail.com')); // true
var_dump(validarEmail('invalido')); // false
Ejercicio 2: Validar edad
Crea una funcion validarEdad(mixed $edad): bool
que verifique si la edad es un numero entre 0 y 150.
Ver solucion
<?php
declare(strict_types=1);
function validarEdad(mixed $edad): bool
{
$opciones = [
'options' => [
'min_range' => 0,
'max_range' => 150,
],
];
return filter_var($edad, FILTER_VALIDATE_INT, $opciones) !== false;
}
var_dump(validarEdad(25)); // true
var_dump(validarEdad(200)); // false
var_dump(validarEdad('abc')); // false
Ejercicio 3: Limpiar texto
Crea una funcion limpiarTexto(string $texto): string
que elimine etiquetas HTML y espacios extras.
Ver solucion
<?php
declare(strict_types=1);
function limpiarTexto(string $texto): string
{
// Eliminar etiquetas HTML
$limpio = strip_tags($texto);
// Eliminar espacios extras
$limpio = preg_replace('/\s+/', ' ', $limpio);
return trim($limpio);
}
$texto = '<b>Hola</b> mundo ';
echo limpiarTexto($texto); // 'Hola mundo'
¿Has encontrado un error o tienes una sugerencia para mejorar esta leccion?
Escribenos¿Te está gustando el curso?
Tenemos cursos premium con proyectos reales y soporte personalizado.
Descubrir cursos premium