¿Por qué verificar el inicio y el final de una cadena en PHP?
\n\nImagine: está creando un sitio web en PHP y necesita verificar si el nombre de un archivo termina en .jpg? ¿O si un correo electrónico comienza con admin? Antes, para esto había que escribir soluciones improvisadas con substr() o expresiones regulares. Pero a partir de PHP 8.0, tenemos una solución elegante: las funciones str_starts_with() y str_ends_with().
No es solo azúcar sintáctico. Son formas rápidas, legibles y seguras de trabajar con cadenas que todo desarrollador PHP debería conocer. En este artículo, las analizaremos con ejemplos reales, las compararemos con enfoques antiguos y mostraremos cómo evitar errores típicos.
\n\n¿Qué son str_starts_with y str_ends_with?
\n\nAmbas funciones aparecieron en PHP 8.0 (lanzado en noviembre de 2020). Resuelven una tarea simple: verificar si una cadena contiene un prefijo (inicio) o un sufijo (final) determinado.
\n\nFirma de las funciones
\n\nstr_starts_with(string $haystack, string $needle): bool\nstr_ends_with(string $haystack, string $needle): bool\n\n- \n
$haystack— la cadena en la que buscamos (pajar). \n $needle— la subcadena que buscamos (aguja). \n - Devuelven
trueofalse. \n
Ejemplo más simple
\n\necho str_starts_with('¡Hola, mundo!', '¡Hola'); // true\necho str_ends_with('¡Hola, mundo!', 'mundo!'); // true\necho str_starts_with('¡Hola, mundo!', 'mundo'); // false\n\nImportante: las funciones distinguen entre mayúsculas y minúsculas. str_starts_with('PHP', 'php') devolverá false. Si necesita una comparación que no distinga mayúsculas de minúsculas, use strtolower() o strtoupper() en ambas cadenas.
Ejemplos reales de uso
\n\n1. Verificar la extensión de un archivo
\n\n$nombreArchivo = 'informe_2024.pdf';\n\nif (str_ends_with($nombreArchivo, '.pdf')) {\n echo "Es un documento PDF";\n} elseif (str_ends_with($nombreArchivo, '.jpg')) {\n echo "Es una imagen";\n} else {\n echo "Formato desconocido";\n}\n\nAntes, esto se hacía con substr($nombreArchivo, -4) — era fácil equivocarse con la longitud del sufijo. Ahora el código se lee como inglés común: «la cadena termina en».
2. Validación de URL o correo electrónico
\n\n$email = 'usuario@gmail.com';\n$url = 'https://pythonlib.ru';\n\nif (str_ends_with($email, '@gmail.com')) {\n echo "Usuario de Gmail";\n}\n\nif (str_starts_with($url, 'https://')) {\n echo "Conexión segura";\n}\n\n3. Filtrar un array de cadenas
\n\n$archivos = ['imagen.jpg', 'documento.pdf', 'foto.png', 'notas.txt'];\n\n$imagenes = array_filter($archivos, function($archivo) {\n return str_ends_with($archivo, '.jpg') || str_ends_with($archivo, '.png');\n});\n\nprint_r($imagenes); // ['imagen.jpg', 'foto.png']\n\nCómo funcionaba antes (y por qué las nuevas funciones son mejores)
\n\nAntes de PHP 8.0, los desarrolladores usaban varios enfoques. Comparemoslos con las nuevas funciones.
\n\nMétodo 1: substr()
\n\n// Forma antigua: verificar inicio\nif (substr($cadena, 0, strlen('prefijo')) === 'prefijo') { ... }\n\n// Forma nueva\nif (str_starts_with($cadena, 'prefijo')) { ... }\n\nDesventajas de la forma antigua:
\n- \n
- Verbosa: hay que calcular la longitud de la subcadena. \n
- Riesgo de error con longitud negativa (si
$needlees más larga que$haystack). \n - Código menos legible. \n
Método 2: strpos()
\n\n// Forma antigua: verificar inicio\nif (strpos($cadena, 'prefijo') === 0) { ... }\n\n// Forma nueva\nif (str_starts_with($cadena, 'prefijo')) { ... }\n\nCon strpos es fácil cometer un error lógico: si no se pone === 0, sino simplemente == false o == 0
Blogs
Book Recommendations
Leer también
Medir velocidad internet con Python: guía práctica
Clase o estructura en C++: ¿cuándo elegir qué? Análisis de la pregunta principal
C# en 2025: Nuevas funciones que cambiarán tu código
Expresiones regulares en Java con ejemplos: guía completa
Algoritmos y estructuras de datos en PHP: guía práctica para desarrolladores web