Verificar palabra en string PHP: ¿qué hay bajo el capó?

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

Introducción: la pregunta que atormenta a todo desarrollador PHP

\n\n

Imagina esta situación: estás programando en PHP y necesitas verificar si un string contiene una palabra específica. Parece algo sencillo, ¿verdad? Sin embargo, cuando buscas en Stack Overflow, descubres que esta pregunta tiene miles de visitas y decenas de respuestas. La gente se confunde con strpos, usa preg_match cuando bastaría una función simple, y cae en trampas con mayúsculas/minúsculas y codificaciones. Hoy no solo te daremos la respuesta lista — vamos a mirar bajo el capó de PHP y analizar cómo funcionan realmente estas funciones. ¿Listo? ¡Allá vamos!

\n\n

El método clásico: strpos y sus trampas ocultas

\n\n

La respuesta más popular en Stack Overflow es usar strpos. Esta función incorporada de PHP busca la posición de la primera aparición de una subcadena. Pero hay un detalle: los principiantes suelen escribir esto:

\n\n
$string = "Hola, mundo!";\n$word = "mundo";\nif (strpos($string, $word)) {\n    echo "¡Palabra encontrada!";\n} else {\n    echo "¡Palabra no encontrada!";\n}\n
\n\n

Y esto funciona... hasta que la palabra está al inicio del string. ¿Por qué? Porque strpos devuelve la posición (un número), y si la palabra está en la posición 0, PHP interpreta 0 como false en la condición if. La forma correcta es:

\n\n
if (strpos($string, $word) !== false) {\n    echo "¡Palabra encontrada!";\n}\n
\n\n

¿Cómo funciona strpos bajo el capó?

\n\n

Cuando llamas a strpos, PHP internamente utiliza un algoritmo de búsqueda de subcadenas. En las versiones modernas de PHP (7.x y 8.x) se aplica un algoritmo optimizado basado en el algoritmo de Boyer-Moore-Horspool. No solo recorre caracteres uno por uno, sino que usa una tabla de "caracteres malos" para saltar bloques enteros de texto si el carácter de la palabra buscada no coincide. Esto hace que la búsqueda sea muy rápida, especialmente en strings largos.

\n\n

Pero hay una limitación: strpos distingue entre mayúsculas y minúsculas. "Mundo" y "mundo" son palabras diferentes para él. Si necesitas una verificación que ignore mayúsculas/minúsculas, usa stripos — su equivalente que ignora el caso.

\n\n

El método moderno: str_contains (PHP 8.0+)

\n\n

A partir de PHP 8.0, llegó la esperada función str_contains. Resuelve el problema de strpos de una vez por todas. En lugar de verificar la posición, simplemente devuelve true o false:

\n\n
$string = "Hola, mundo!";\n$word = "mundo";\nif (str_contains($string, $word)) {\n    echo "¡Palabra encontrada!";\n}\n
\n\n

¿Qué hay dentro de str_contains?

\n\n

Bajo el capó, str_contains es un envoltorio sobre strpos. Llama a la misma función interna de búsqueda, pero el resultado se convierte automáticamente en un valor booleano. Esto hace que el código sea más limpio y seguro. Sin embargo, si trabajas con versiones antiguas de PHP (7.4 o inferiores), str_contains no está disponible — tendrás que usar strpos con la verificación !== false.

\n\n

Herramienta poderosa: expresiones regulares con preg_match

\n\n

A veces no basta con verificar una simple palabra, sino un grupo completo de palabras o un patrón. Aquí entra en escena preg_match. Las expresiones regulares te dan superpoderes: puedes buscar palabras completas (para que "mundo" no coincida con "mundial"), ignorar mayúsculas/minúsculas, buscar por límites de palabras y mucho más.

\n\n
$string = "¡Hola, mundial!";\n$word = "mundo";\nif (preg_match("/\\b" . preg_quote($word, '/') . "\\b/ui", $string)) {\n    echo "¡Palabra encontrada!";\n} else {\n    echo "¡Palabra no encontrada!";\n}\n
\n\n

Aquí \\b es el límite de palabra, y la bandera u activa el soporte Unicode (para que funcione correctamente con caracteres acentuados como "é" o "ñ"). La bandera i hace que la búsqueda no distinga entre mayúsculas y minúsculas. La función preg_quote escapa caracteres especiales, por si la palabra contiene símbolos como puntos o signos de interrogación.

Blogs

Book Recommendations