«¿Mi cadena comienza con esta palabra?» — la eterna pregunta del desarrollador PHP
\n\nImagina la situación: estás escribiendo un analizador de URL, procesando solicitudes entrantes o simplemente filtrando una lista de archivos. Y surge la tarea: necesitas verificar si una cadena comienza con un conjunto específico de caracteres. Parecería que no podría ser más simple. Pero no fue así. Hasta hace poco, PHP no tenía una función incorporada para esta operación tan simple. Los desarrolladores se las ingeniaban como podían: algunos cortaban la cadena con substr(), otros buscaban la posición con strpos(), y otros se adentraban en el intrincado mundo de las expresiones regulares.
En este artículo, desglosaremos todas las formas de verificar el inicio de una cadena en PHP. No solo aprenderás cómo hacerlo «de forma elegante» en versiones modernas, sino también cómo resolver la tarea en proyectos «heredados» donde PHP 5 todavía está en uso. ¡Allá vamos!
\n\nLa forma más correcta: str_starts_with() (PHP 8.0+)
\n\nSi tu proyecto funciona con PHP 8.0 o superior, eres un afortunado. Tienes disponible la función nativa str_starts_with(), que hace exactamente lo que dice en la etiqueta. Acepta dos argumentos: la cadena original y la subcadena que buscamos al inicio. Devuelve true o false.
<?php\n$url = "https://pythonlib.ru/php-tutorial";\n\nif (str_starts_with($url, "https://")) {\n echo "Enlace seguro, usamos HTTPS";\n} else {\n echo "¡Atención! Conexión no HTTPS";\n}\n// Muestra: Enlace seguro, usamos HTTPS\n?>\n\n¿Por qué es la mejor opción?
\n- \n
- Legibilidad — el código habla por sí mismo. No necesitas comentar qué hace esta línea. \n
- Rendimiento — la función está optimizada a nivel de código C de PHP. Funciona más rápido que las comprobaciones manuales. \n
- Seguridad — sin problemas con codificaciones multibyte (a menos que trabajes con UTF-8 de una manera especial, pero hablaremos de eso más adelante). \n
Por cierto, la función tiene una «hermana gemela» — str_ends_with(), que verifica el final de la cadena. Pero ese es tema para otro artículo.
El clásico del género: strpos()
\n\nAntes de la llegada de str_starts_with(), la forma más popular era usar la función strpos(). Busca la primera aparición de una subcadena dentro de una cadena y devuelve su posición (un número). Si no se encuentra la subcadena, devuelve false.
El truco está en que si la subcadena está al principio, su posición será 0. Y 0 en PHP es un valor falsy. Por lo tanto, la comprobación debe ser estricta:
\n\n<?php\n$string = "¡Hola, mundo!";\n\nif (strpos($string, "¡Hola") === 0) {\n echo "La cadena comienza con ¡Hola";\n} else {\n echo "No, el inicio es otro";\n}\n?>\n\n¡Importante! Usa siempre el operador de comparación estricta ===, no ==. ¿Por qué? Imagina que buscas una subcadena que no existe. strpos() devolverá false. Si escribes strpos($string, "test") == 0, entonces false == 0 dará true (porque PHP convierte tipos). Y tu código dirá que la cadena comienza con "test", aunque no sea así. ¡Una trampa clásica para principiantes!
Ventajas y desventajas de strpos()
\n- \n
- ✅ Funciona en todas las versiones de PHP, desde la 4. \n
- ✅ No requiere instalar extensiones. \n
- ❌ El código es menos legible — hay que recordar la comparación estricta. \n
- ❌ Si se usa incorrectamente (sin ===), produce errores difíciles de detectar. \n
El método del abuelo: substr()
\n\nOtra forma que nos llega desde las profundidades de la historia. La idea es simple: extraer de la cadena un trozo de la misma longitud que la subcadena buscada y compararlos.
\n\n<?php\n$filename = "reporte_2024.pdf";\n\n$prefix = "reporte_";\nif (substr($filename, 0, strlen($prefix)) === $prefix) {\n echo "Este es el informe de 2024";