PHP str_starts_with y str_ends_with: explicación para principiantes

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Por qué verificar el inicio y el final de una cadena en PHP?

\n\n

Imagine: 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().

\n\n

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\n

Ambas 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\n

Firma de las funciones

\n\n
str_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 true o false.
  • \n
\n\n

Ejemplo más simple

\n\n
echo str_starts_with('¡Hola, mundo!', '¡Hola'); // true\necho str_ends_with('¡Hola, mundo!', 'mundo!');   // true\necho str_starts_with('¡Hola, mundo!', 'mundo');  // false
\n\n

Importante: 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.

\n\n

Ejemplos reales de uso

\n\n

1. 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\n

Antes, 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».

\n\n

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\n

3. 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\n

Cómo funcionaba antes (y por qué las nuevas funciones son mejores)

\n\n

Antes de PHP 8.0, los desarrolladores usaban varios enfoques. Comparemoslos con las nuevas funciones.

\n\n

Mé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\n

Desventajas de la forma antigua:

\n
    \n
  • Verbosa: hay que calcular la longitud de la subcadena.
  • \n
  • Riesgo de error con longitud negativa (si $needle es más larga que $haystack).
  • \n
  • Código menos legible.
  • \n
\n\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\n

Con strpos es fácil cometer un error lógico: si no se pone === 0, sino simplemente == false o == 0

Blogs

Book Recommendations