Menu

PHP str_contains(): comprobar si un string contiene texto

str_contains($haystack, $needle) devuelve true si $needle aparece en cualquier lugar de $haystack. Aprende la versión sin distinguir mayúsculas, str_starts_with y str_ends_with, cómo comprobar varias palabras y la versión con strpos para PHP 7.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

str_contains($haystack, $needle) devuelve true si $needle aparece en cualquier lugar de $haystack, y false en caso contrario. Se añadió en PHP 8.0 y distingue mayúsculas y minúsculas.

A diferencia de strpos(), devuelve un booleano real, así que no existe la trampa de "encontrado en la posición 0 parece false".

Sintaxis

str_contains(string $haystack, string $needle): bool
str_starts_with(string $haystack, string $needle): bool
str_ends_with(string $haystack, string $needle): bool

Las tres se añadieron en PHP 8.0 y trabajan byte a byte, así que manejan correctamente el japonés y otro texto UTF-8 sin necesidad de una versión mb_.

Comprobar el principio o el final con str_starts_with y str_ends_with

Contiene sin distinguir mayúsculas y minúsculas

No existe str_icontains(). Pasa primero las dos cadenas a minúsculas. mb_strtolower() también pasa a minúsculas letras fuera de ASCII, como É o el cirílico, que strtolower() deja intactas.

La aguja vacía devuelve true

Una aguja vacía se encuentra en cualquier cadena, incluida una vacía. Esto importa cuando la aguja viene de un buscador que el usuario dejó en blanco.

Comprobar si una cadena contiene alguna o todas de varias palabras

str_contains() acepta una sola aguja. Recorre un array de agujas: devuelve en cuanto una coincida para "alguna", o en cuanto una falle para "todas".

Para comprobar si un valor es uno de los elementos de un array, y no una subcadena de una cadena, usa in_array().

Antes de PHP 8: strpos !== false

El código que tiene que funcionar en PHP 7 usa strpos() con una comparación estricta. Da la misma respuesta que str_contains(), salvo con una aguja vacía: el strpos() de PHP 7 imprimía Warning: strpos(): Empty needle y devolvía false.

La última línea imprime bool(false) aunque el texto está ahí, porque php está en la posición 0. Sustituir esas comprobaciones por str_contains() es una de las mejoras más fáciles al pasar a PHP 8.

Preguntas frecuentes

¿Cómo compruebo si una cadena contiene una palabra en PHP?

En PHP 8 usa str_contains($haystack, $needle), que devuelve true o false: str_contains('Hello world', 'world') es true. En PHP 7 usa strpos($haystack, $needle) !== false.

¿str_contains distingue mayúsculas y minúsculas?

Sí. Para una comprobación sin distinguirlas, pasa los dos lados a minúsculas: str_contains(mb_strtolower($haystack), mb_strtolower($needle)), o usa stripos($haystack, $needle) !== false.

¿Por qué str_contains devuelve true con una cadena vacía?

Toda cadena contiene la cadena vacía, así que str_contains('abc', '') devuelve true. Si la aguja viene de la entrada del usuario, comprueba antes que no esté vacía.

¿Cómo compruebo si una cadena empieza o termina con algo en PHP?

Usa str_starts_with($s, 'http') y str_ends_with($s, '.pdf'), añadidas las dos en PHP 8.0. Igual que str_contains(), distinguen mayúsculas y minúsculas y devuelven un bool.

Ilustración de los lenguajes de programación de Coddy

Aprende a programar con Coddy

COMENZAR