sscanf()
Aprende a usar la función PHP sscanf() para analizar cadenas según un formato y extraer valores tipados de texto con estructura predecible.
La función PHP sscanf() lee una cadena y extrae valores según un formato que tú describes — es la operación inversa de sprintf(). Mientras que sprintf() construye una cadena formateada a partir de variables, sscanf() descompone una cadena formateada de vuelta en variables. Es especialmente útil cuando tienes texto con una forma predecible (fechas, coordenadas, líneas de registro, códigos de identificación) y quieres piezas limpias y tipadas sin necesidad de escribir una expresión regular.
Este capítulo cubre la sintaxis, las dos formas de recibir resultados, los especificadores de formato que realmente usarás y los errores más comunes.
Sintaxis
sscanf(string $string, string $format, mixed &...$vars): array|int|null$string— el texto de entrada que se va a analizar.$format— una plantilla que describe qué leer, usando especificadores%(la misma familia que usaprintf).&...$vars— variables opcionales, pasadas por referencia, que reciben los valores analizados.
El comportamiento de sscanf() depende de si pasas esas variables adicionales:
| Forma de llamada | Valor de retorno |
|---|---|
Solo $string y $format | Un array con los valores analizados |
Con variables por referencia tras $format | Un int: cuántos valores se asignaron correctamente |
Devolver los valores como un array
Si omites los argumentos por referencia, sscanf() devuelve todo como un array. Este es el estilo más limpio en PHP moderno y evita pasar variables por referencia.
%s lee la siguiente palabra sin espacios en blanco (John), y %d lee un entero (25, almacenado como un int real, no como la cadena "25"). La salida es:
John
25Asignar directamente en variables
Pasar variables después del formato las rellena directamente. En este modo, el valor de retorno es el número de campos que coincidieron, lo que es útil para validar la entrada.
<?php
$input = 'John 25';
$matched = sscanf($input, '%s %d', $name, $age);
echo $matched . "\n"; // 2 (both fields were read)
echo $name . "\n"; // John
echo $age; // 25
?>Nota: en PHP 8 se eliminó el prefijo
&en tiempo de llamada (p. ej.sscanf($s, $f, &$name)). Simplemente pasa la variable sin prefijo —sscanf()ya declara esos parámetros como por referencia internamente.
Especificadores de formato comunes
| Especificador | Lee |
|---|---|
%s | Una cadena hasta el siguiente espacio en blanco |
%d | Un entero decimal con signo |
%f | Un número de punto flotante |
%x | Un entero hexadecimal |
%c | Un único carácter |
%% | Un signo % literal |
Los caracteres literales en el formato (espacios, barras, dos puntos) también deben aparecer en la entrada. Esto hace que sscanf() sea excelente para datos con forma fija, como fechas:
<?php
$date = '2026-06-21';
[$year, $month, $day] = sscanf($date, '%d-%d-%d');
printf("Year=%d Month=%d Day=%d", $year, $month, $day);
// Year=2026 Month=6 Day=21
?>Cuándo usar sscanf() frente a alternativas
- Usa
sscanf()cuando el formato es fijo y simple y quieres resultados tipados en una sola línea. - Usa
explode()cuando solo necesitas dividir por un delimitador y mantener todo como cadenas. - Usa
preg_match()cuando la estructura es irregular o necesita reglas de validación que van más allá de los tipos de campo simples. - Para hacer lo contrario — ensamblar una cadena formateada — usa
sprintf()oprintf().
Para leer entrada formateada directamente desde un archivo en lugar de una cadena, consulta fscanf(), que funciona de la misma manera línea a línea.
Errores comunes
%sse detiene en los espacios en blanco. No capturará un valor de varias palabras. Para leer el resto de una línea, usa un conjunto de escaneo como%[^\n].- Un campo que no coincide aborta el resto. Si se espera
%dpero la entrada contiene letras, el análisis se detiene; el valor de retorno de conteo te permite detectar esto. - Las variables posteriores sin coincidencia se convierten en
null. Comprueba siempre el conteo devuelto antes de confiar en las variables siguientes.