¿Cómo verificar si una cadena contiene una palabra específica en PHP?

Publicado 27 de agosto de 2024

Método 1: Usar la función strpos() para comprobar si una cadena PHP contiene una subcadena

La función strpos() es una función incorporada de PHP que permite verificar si una cadena contiene una subcadena. Devuelve el índice de la primera aparición de la subcadena en la cadena, o false si no se encuentra la subcadena.

Cómo funciona la función strpos()

La función strpos() toma dos parámetros:

  1. $haystack: La cadena en la que se va a buscar.
  2. $needle: La subcadena que se va a buscar.

Devuelve un número entero que representa el índice de la primera aparición de la aguja en el pajar, o false si no se encuentra la aguja.

Hay que tener en cuenta que strpos() realiza una búsqueda sensible a mayúsculas y minúsculas. Esto significa que tiene en cuenta las letras mayúsculas y minúsculas al buscar la subcadena.

Aquí tienes un ejemplo de cómo usar strpos() para comprobar si una cadena contiene una palabra:

$palabra = "zorro";
$micadena = "El rápido zorro marrón salta sobre el perro perezoso";

// Comprobar si la cadena contiene la palabra
if (strpos($micadena, $palabra) !== false) {
    echo "¡Palabra encontrada!";
} else {
    echo "¡Palabra no encontrada!";
}

En este código:

  • Establecemos la variable $palabra como la subcadena que queremos buscar, que es "zorro".
  • También tenemos la variable $micadena que contiene la frase en la que queremos buscar la palabra.
  • Utilizamos la función strpos() para comprobar si $micadena contiene $palabra.
    • Si se encuentra la palabra, strpos() devuelve el índice de su primera aparición.
    • Si no se encuentra la palabra, strpos() devuelve false.
  • La condición strpos($micadena, $palabra) !== false comprueba si el valor devuelto no es false.
    • Si se encuentra la palabra, la condición es verdadera y se ejecuta el código del bloque if, imprimiendo "¡Palabra encontrada!".
    • Si no se encuentra la palabra, se ejecuta el bloque else, imprimiendo "¡Palabra no encontrada!".

Ejemplo

Supongamos que tienes un formulario en tu sitio web donde los usuarios pueden introducir sus direcciones de correo electrónico. Quieres comprobar las direcciones de correo electrónico para asegurarte de que son de un dominio específico, como "ejemplo.com". Así es como puedes usar strpos() para comprobar si la dirección de correo electrónico contiene el dominio:

$email = "usuario@ejemplo.com";
$dominio = "ejemplo.com";

if (strpos($email, $dominio) !== false) {
    echo "¡Dominio de correo electrónico válido!";
} else {
    echo "¡Dominio de correo electrónico no válido!";
}

En este ejemplo, comprobamos si la cadena $email contiene la subcadena $dominio. Si es así, consideramos que la dirección de correo electrónico es válida e imprimimos "¡Dominio de correo electrónico válido!". Si no, imprimimos "¡Dominio de correo electrónico no válido!".

Diferencias entre las funciones strpos() y stripos()

PHP también tiene la función stripos(), que es como strpos() pero realiza una búsqueda sin distinción entre mayúsculas y minúsculas. Esto significa que stripos() no tiene en cuenta las letras mayúsculas y minúsculas al buscar la subcadena.

Usarías strpos() cuando necesites hacer una búsqueda sensible a mayúsculas y minúsculas y quieras hacer coincidir exactamente el caso de la subcadena. Usarías stripos() cuando el caso de la subcadena no importe y quieras encontrar la subcadena sin importar su caso.

Aquí tienes un ejemplo que muestra la diferencia:

$palabra = "Zorro";
$micadena = "El rápido zorro marrón salta sobre el perro perezoso";

if (strpos($micadena, $palabra) !== false) {
    echo "¡Palabra encontrada usando strpos()!";
} else {
    echo "¡Palabra no encontrada usando strpos()!";
}

if (stripos($micadena, $palabra) !== false) {
    echo "¡Palabra encontrada usando stripos()!";
} else {
    echo "¡Palabra no encontrada usando stripos()!";
}

En este caso:

  • strpos() devolvería "¡Palabra no encontrada!" porque realiza una búsqueda sensible a mayúsculas y minúsculas y la subcadena "Zorro" (con "Z" mayúscula) no existe en la cadena.
  • stripos() devolvería "¡Palabra encontrada!" porque realiza una búsqueda insensible a mayúsculas y minúsculas y encuentra la subcadena "zorro" (con "z" minúscula) en la cadena.

Comparación de strpos() con otras funciones de búsqueda de cadenas

PHP tiene otras funciones para buscar en cadenas, como strstr(), stristr(), strrchr() y strpbrk(). Aquí tienes una comparación de estas funciones:

Función Descripción Devuelve
strpos() Encuentra la posición de la primera aparición de una subcadena Índice de la primera aparición o false
strstr() Encuentra la primera aparición de una subcadena Subcadena desde la primera aparición o false
stristr() Versión insensible a mayúsculas y minúsculas de strstr() Subcadena desde la primera aparición o false
strrchr() Encuentra la última aparición de un carácter Subcadena desde la última aparición o false
strpbrk() Busca en una cadena cualquiera de un conjunto de caracteres Subcadena desde la primera aparición o false

Ejemplo

$micadena = "El rápido zorro marrón salta sobre el perro perezoso";

// Usando strpos()
$posicion = strpos($micadena, "zorro");
echo "Posición de 'zorro' usando strpos(): " . $posicion . "\n";

// Usando strstr()
$subcadena = strstr($micadena, "marrón");
echo "Subcadena desde 'marrón' usando strstr(): " . $subcadena . "\n";

// Usando stristr()
$subcadena = stristr($micadena, "SALTA");
echo "Subcadena desde 'SALTA' usando stristr(): " . $subcadena . "\n";

// Usando strrchr()
$subcadena = strrchr($micadena, "o");
echo "Subcadena desde la última 'o' usando strrchr(): " . $subcadena . "\n";

// Usando strpbrk()
$subcadena = strpbrk($micadena, "aeiou");
echo "Subcadena desde la primera vocal usando strpbrk(): " . $subcadena . "\n";

Salida:

Posición de 'zorro' usando strpos(): 10
Subcadena desde 'marrón' usando strstr(): marrón salta sobre el perro perezoso
Subcadena desde 'SALTA' usando stristr(): salta sobre el perro perezoso
Subcadena desde la última 'o' usando strrchr(): oso
Subcadena desde la primera vocal usando strpbrk(): el rápido zorro marrón salta sobre el perro perezoso

Método 2: Comprobar si una cadena contiene una palabra usando str_contains() en PHP 8

PHP 8 añadió una nueva función llamada str_contains() que facilita la comprobación de si una cadena contiene una subcadena. Esta función simplifica la búsqueda de una palabra específica dentro de una cadena, mejorando la legibilidad y el rendimiento del código.

Función str_contains()

La función str_contains() es nueva en PHP 8 y permite comprobar si una cadena contiene una subcadena. Devuelve un valor booleano que indica si la subcadena se encuentra dentro de la cadena.

Esta función proporciona una forma más sencilla de realizar esta tarea común en comparación con el uso de strpos() o stripos(), que requieren más comprobaciones para el valor devuelto.

Sintaxis y uso de str_contains()

La función str_contains() tiene esta sintaxis:

str_contains(string $haystack, string $needle): bool
  • $haystack: La cadena en la que se va a buscar.
  • $needle: La subcadena que se va a buscar.

La función devuelve true si se encuentra $needle dentro de $haystack, y false si no.

Aquí tienes un ejemplo de cómo usar str_contains() para comprobar si una cadena contiene una palabra específica:

$texto = "El rápido zorro marrón salta sobre el perro perezoso";
$palabra = "zorro";

if (str_contains($texto, $palabra)) {
    echo "La palabra '$palabra' se encuentra en el texto.";
} else {
    echo "La palabra '$palabra' no se encuentra en el texto.";
}

En este ejemplo, str_contains() comprueba si la cadena $texto contiene la palabra $palabra. Como la palabra "zorro" está en el texto, la función devuelve true, y se muestra el mensaje "La palabra 'zorro' se encuentra en el texto.".

Ventajas de usar str_contains() sobre otros métodos

El uso de str_contains() tiene ventajas sobre otros métodos como strpos() y stripos():

  1. Mejor legibilidad: El nombre de la función str_contains() indica claramente su propósito, haciendo que el código sea más legible. Elimina la necesidad de realizar más comprobaciones sobre el valor devuelto, ya que devuelve un booleano.

  2. Simplicidad: Con str_contains(), puedes comprobar si una cadena contiene una subcadena en una sola llamada a función. No necesitas comparar el valor devuelto con false o 0, como se requiere con strpos() y stripos().

  3. Mejor rendimiento: La función str_contains() está diseñada para un mejor rendimiento y es más rápida que usar strpos() o stripos() en la mayoría de los casos. Evita devolver la posición de la subcadena, que no es necesaria cuando solo quieres saber si la subcadena existe.

Método 3: Usar expresiones regulares para comprobar si una cadena PHP contiene una palabra específica

Las expresiones regulares (regex)son una herramienta para trabajar con cadenas en PHP. Te permiten buscar patrones en el texto, no solo palabras específicas, lo que las hace flexibles para tareas de manipulación de cadenas.

Usar preg_match() para comprobar si una cadena contiene una palabra

La función preg_match() en PHP te permite comprobar si una cadena coincide con un patrón de expresión regular. Puedes usar esto para comprobar si una cadena contiene una palabra específica.

La función preg_match() tiene esta sintaxis:

preg_match(string $pattern, string $subject, array &$matches = null, int $flags = 0, int $offset = 0): int|false
  • $pattern: El patrón de expresión regular para buscar coincidencias.
  • $subject: La cadena en la que buscar.
  • $matches: (Opcional) Un array que se llenará con los resultados de la búsqueda.
  • $flags: (Opcional) Banderas para modificar el comportamiento de la búsqueda.
  • $offset: (Opcional) El desplazamiento en la cadena para comenzar la búsqueda.

La función devuelve el número de coincidencias encontradas (0 o 1), o false en caso de error.

Aquí tienes un ejemplo de uso de preg_match() para comprobar si una cadena contiene una palabra:

$texto = "El rápido zorro marrón salta sobre el perro perezoso";
$palabra = "zorro";
$patron = "/\b$palabra\b/";

if (preg_match($patron, $texto)) {
    echo "La palabra '$palabra' se encuentra en la cadena.";
} else {
    echo "La palabra '$palabra' no se encuentra en la cadena.";
}

En este código:

  • La variable $texto contiene la cadena en la que buscar.
  • La variable $palabra contiene la palabra que se va a buscar.
  • La variable $patron contiene el patrón de expresión regular. Utiliza el ancla \b para coincidir con los límites de palabras, asegurando que solo se encuentren palabras completas (así "zorro" no coincidirá con "zorros").
  • preg_match() comprueba si el $patron coincide con el $texto.
    • Si se encuentra una coincidencia, devuelve 1 y se muestra el mensaje "palabra encontrada".
    • Si no se encuentra ninguna coincidencia, devuelve 0 y se muestra el mensaje "palabra no encontrada".

También puedes usar el parámetro $matches para obtener el texto coincidente:

if (preg_match($patron, $texto, $coincidencias)) {
    echo "Texto coincidente: " . $coincidencias[0];
}

Esto mostraría: "Texto coincidente: zorro".

Ejemplo

  1. Validación de correo electrónico: Puedes usar una expresión regular para comprobar si una cadena es una dirección de correo electrónico válida. Por ejemplo:

    $email = "juan.perez@ejemplo.com";
    $patron = "/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/";
    
    if (preg_match($patron, $email)) {
       echo "Dirección de correo electrónico válida";
    } else {
       echo "Dirección de correo electrónico no válida";
    }
  2. Extracción de números de teléfono: Puedes usar una expresión regular para obtener números de teléfono de una cadena. Por ejemplo:

    $texto = "Llámanos al 123-456-7890 o al 987-654-3210";
    $patron = "/\d{3}-\d{3}-\d{4}/";
    
    if (preg_match_all($patron, $texto, $coincidencias)) {
       echo "Números de teléfono encontrados: " . implode(", ", $coincidencias[0]);
    } else {
       echo "No se encontraron números de teléfono";
    }

    Esto mostraría: "Números de teléfono encontrados: 123-456-7890, 987-654-3210".

  3. Eliminación de etiquetas HTML: Puedes usar una expresión regular para eliminar etiquetas HTML de una cadena. Por ejemplo:

    $html = "<p>Hola <b>mundo</b>!</p>";
    $patron = "/<\/?[a-z][a-z0-9]*[^<>]*>/i";
    
    $texto = preg_replace($patron, "", $html);
    echo $texto;

    Esto mostraría: "Hola mundo!".

Ventajas y desventajas de usar expresiones regulares

Las expresiones regulares tienen ventajas y desventajas al comprobar si una cadena contiene una palabra.

Ventajas

  • Flexibilidad: Las expresiones regulares pueden coincidir con patrones complejos, no solo palabras específicas. Puedes usar clases de caracteres, anclas, cuantificadores y más para definir patrones precisos.
  • Potencia: Con las expresiones regulares, puedes hacer más que solo comprobar si una cadena contiene una palabra. Puedes obtener partes de la cadena, reemplazar texto, dividir la cadena y más.

Desventajas

  • Complejidad: La sintaxis de las expresiones regulares puede ser difícil de leer y escribir, especialmente para patrones complejos. Esto puede hacer que el código sea más difícil de entender y mantener.
  • Rendimiento: Para búsquedas de texto simples, el uso de expresiones regulares puede ser más lento que usar funciones de cadena como strpos() o str_contains(). Las expresiones regulares tienen que compilar el patrón y luego buscar en la cadena, lo que lleva tiempo.

Otros métodos para comprobar si una cadena PHP contiene una palabra específica

Usar la función strstr()

La función strstr() en PHP es otra forma de comprobar si una cadena contiene una palabra específica. Busca la primera aparición de una subcadena en una cadena y devuelve el resto de la cadena a partir de ese punto.

La sintaxis de strstr() es la siguiente:

strstr(string $haystack, string $needle, bool $before_needle = false): string|false
  • $haystack: La cadena en la que buscar.
  • $needle: La subcadena que se va a buscar.
  • $before_needle: (Opcional) Si se establece en true, la función devuelve la parte de la cadena antes de la primera aparición de la subcadena. El valor predeterminado es false.

Aquí tienes un ejemplo de uso de strstr() para comprobar si una cadena contiene una palabra:

$texto = "El rápido zorro marrón salta sobre el perro perezoso";
$palabra = "zorro";

if (strstr($texto, $palabra)) {
    echo "La palabra '$palabra' se encuentra en la cadena.";
} else {
    echo "La palabra '$palabra' no se encuentra en la cadena.";
}

En este ejemplo, strstr() busca la palabra "zorro" en la cadena $texto. Si se encuentra la palabra, la función devuelve la subcadena desde la primera aparición de "zorro" hasta el final de la cadena. La condición if (strstr($texto, $palabra)) comprueba si el valor devuelto es verdadero (no false), lo que indica que se ha encontrado la palabra.

Ejemplo

Supongamos que tienes una lista de descripciones de productos y quieres comprobar si se menciona una palabra clave específica en cada descripción. Puedes usar strstr() para buscar la palabra clave en cada cadena de descripción.

$productos = [
    "Apple iPhone 12 Pro Max - 128GB - Azul Pacífico",
    "Samsung Galaxy S21 Ultra 5G - 256GB - Negro Fantasma",
    "Google Pixel 5 - 128GB - Negro"
];

$palabraClave = "iPhone";

foreach ($productos as $producto) {
    if (strstr($producto, $palabraClave)) {
        echo "El producto '$producto' contiene la palabra clave '$palabraClave'.
"; } }

Salida:

El producto 'Apple iPhone 12 Pro Max - 128GB - Azul Pacífico' contiene la palabra clave 'iPhone'.

Dividir la cadena en un array con explode()

Otro enfoque para comprobar si una cadena contiene una palabra específica es dividir la cadena en un array de palabras usando la función explode() y luego comprobar si la palabra existe en el array.

La función explode() divide una cadena en un array utilizando un delimitador especificado. Aquí tienes la sintaxis:

explode(string $separator, string $string, int $limit = PHP_INT_MAX): array
  • $separator: El delimitador utilizado para dividir la cadena.
  • $string: La cadena que se va a dividir.
  • $limit: (Opcional) El número máximo de elementos que se devolverán en el array. El valor predeterminado es PHP_INT_MAX.

Aquí tienes un ejemplo de uso de explode() para comprobar si una cadena contiene una palabra:

$texto = "El rápido zorro marrón salta sobre el perro perezoso";
$palabra = "zorro";

$arrayPalabras = explode(" ", $texto);

if (in_array($palabra, $arrayPalabras)) {
    echo "La palabra '$palabra' se encuentra en la cadena.";
} else {
    echo "La palabra '$palabra' no se encuentra en la cadena.";
}

En este código, explode(" ", $texto) divide la cadena $texto en un array de palabras utilizando el espacio como delimitador. El array resultante $arrayPalabras contiene cada palabra de la cadena como un elemento separado.

La función in_array() se utiliza entonces para comprobar si la palabra $palabra existe en el $arrayPalabras. Si se encuentra la palabra, la función devuelve true y se muestra el mensaje correspondiente.

Ejemplo

Supongamos que tienes una función de búsqueda en tu sitio web donde los usuarios pueden introducir varias palabras clave separadas por comas. Puedes usar explode() para dividir la entrada del usuario en un array de palabras clave y luego buscar cada palabra clave en tu base de datos o contenido.

$entradaUsuario = "manzana, samsung, google";
$palabrasClave = explode(", ", $entradaUsuario);

// Buscar productos que contengan cualquiera de las palabras clave
$productos = ["Apple iPhone 12 Pro Max - 128GB - Azul Pacífico",
    "Samsung Galaxy S21 Ultra 5G - 256GB - Negro Fantasma",
    "Google Pixel 5 - 128GB - Negro"
];

foreach ($productos as $producto) {
    foreach ($palabrasClave as $palabraClave) {
        if (strstr($producto, $palabraClave)) {
            echo "El producto '$producto' coincide con la palabra clave '$palabraClave'.
"; } } }

Salida:

El producto 'Apple iPhone 12 Pro Max - 128GB - Azul Pacífico' coincide con la palabra clave 'manzana'.
El producto 'Samsung Galaxy S21 Ultra 5G - 256GB - Negro Fantasma' coincide con la palabra clave 'samsung'.
El producto 'Google Pixel 5 - 128GB - Negro' coincide con la palabra clave 'google'.

Comparar la cadena con la palabra usando operadores idénticos

También puedes comprobar si una cadena contiene una palabra específica comparando directamente la cadena con la palabra usando el operador idéntico ===.

Aquí tienes un ejemplo:

$texto = "zorro";
$palabra = "zorro";

if ($texto === $palabra) {
    echo "La cadena es idéntica a la palabra '$palabra'.";
} else {
    echo "La cadena no es idéntica a la palabra '$palabra'.";
}

En este caso, la cadena $texto se compara directamente con la palabra $palabra usando el operador ===. Si la cadena y la palabra son idénticas, la condición if ($texto === $palabra) se evalúa como true, y se muestra el mensaje correspondiente.

Sin embargo, este método tiene limitaciones:

  • Solo funciona si la cadena coincide exactamente con la palabra. Si la cadena contiene caracteres adicionales o la palabra es una subcadena de la cadena, la comparación devolverá false.
  • Es sensible a mayúsculas y minúsculas. Si la cadena y la palabra tienen diferentes mayúsculas y minúsculas, la comparación devolverá false.

Por lo tanto, este método solo es adecuado cuando quieres comprobar si una cadena es idéntica a una palabra específica, en lugar de comprobar si la cadena contiene la palabra como una subcadena.

Ejemplo

Considera un escenario donde tienes una lista de categorías predefinidas y quieres comprobar si una cadena dada coincide exactamente con alguna de esas categorías.

$categorias = ["Electrónica", "Ropa", "Hogar"];
$categoriaProducto = "Electrónica";

if (in_array($categoriaProducto, $categorias, true)) {
    echo "La categoría del producto '$categoriaProducto' es válida.";
} else {
    echo "La categoría del producto '$categoriaProducto' no es válida.";
}

En este ejemplo, la función in_array() con el tercer parámetro establecido en true realiza una comparación estricta (operador idéntico ===) entre la $categoriaProducto y cada elemento del array $categorias. Si se encuentra una coincidencia exacta, se considera que la categoría del producto es válida.

Método Descripción Caso de uso
strstr() Busca la primera aparición de una subcadena en una cadena Comprobar si una cadena contiene una palabra específica como subcadena
explode() Divide una cadena en un array por un delimitador especificado Dividir una cadena en palabras y comprobar si existe una palabra específica en el array
Operador idéntico === Compara una cadena directamente con una palabra Comprobar si una cadena coincide exactamente con una palabra específica