stripos()
La función stripos() en PHP busca la posición de la primera ocurrencia de una subcadena en una cadena sin distinguir mayúsculas de minúsculas.
Introducción
stripos() encuentra la posición de la primera ocurrencia de una subcadena dentro de una cadena, ignorando las mayúsculas y minúsculas. Devuelve el índice basado en cero donde comienza la coincidencia, o false si la subcadena no está presente.
La i del nombre significa case-insensitive (sin distinción de mayúsculas): "PHP", "php" y "Php" coinciden de la misma manera. Si necesitas una búsqueda con distinción de mayúsculas, usa strpos(). Esta página cubre la sintaxis, el problema crítico de !== false, el parámetro opcional $offset y cómo stripos() se relaciona con las demás funciones de posición.
Sintaxis
stripos(string $haystack, string $needle, int $offset = 0): int|false| Parámetro | Descripción |
|---|---|
$haystack | La cadena en la que buscar. |
$needle | La subcadena que se busca. |
$offset | Opcional. El índice en $haystack donde comienza la búsqueda. El valor predeterminado es 0 (el inicio). Un offset negativo cuenta desde el final de la cadena. |
Valor de retorno: la posición basada en cero de la primera coincidencia (un int), o false si $needle no se encuentra.
Un ejemplo básico
El needle "fox" está en minúsculas, pero el haystack contiene "FOX". Como stripos() ignora las mayúsculas, sigue encontrando la coincidencia e imprime:
Found 'fox' at position 16Si usas strpos() aquí, el resultado sería false, ya que las mayúsculas difieren.
El problema de !== false
Este es el error más común con stripos() (y con todas las funciones *pos()). Cuando se encuentra una coincidencia al inicio mismo de la cadena, el valor de retorno es 0 — y 0 es falsy en PHP. Una comprobación laxa como if (stripos(...)) trataría una coincidencia real como "no encontrado":
<?php
$pos = stripos("Hello world", "hello");
// Wrong: 0 is falsy, so this branch runs even though there IS a match
if ($pos) {
echo "loose check: found\n";
} else {
echo "loose check: NOT found (wrong!)\n";
}
// Correct: compare against false with the strict !== operator
if ($pos !== false) {
echo "strict check: found at position $pos\n";
} else {
echo "strict check: not found\n";
}Salida:
loose check: NOT found (wrong!)
strict check: found at position 0Compara siempre el resultado con !== false cuando solo quieras saber si existe la subcadena.
Uso del parámetro $offset
El tercer argumento permite comenzar la búsqueda a mitad de la cadena — útil para encontrar la segunda (o posterior) ocurrencia:
<?php
$text = "PHP is great. PHP is everywhere.";
$first = stripos($text, "php"); // start at 0
$second = stripos($text, "php", $first + 1); // skip past the first match
echo "First occurrence: $first\n";
echo "Second occurrence: $second\n";Salida:
First occurrence: 0
Second occurrence: 14Un uso práctico: filtro de palabras clave sin distinción de mayúsculas
Como ignora las mayúsculas, stripos() es ideal para comprobaciones del tipo "¿este texto menciona X?", como marcar mensajes que contienen una palabra prohibida sin importar cómo esté escrita:
<?php
$message = "Get this AMAZING deal now!";
$banned = ["amazing", "free", "winner"];
foreach ($banned as $word) {
if (stripos($message, $word) !== false) {
echo "Blocked: contains '$word'\n";
break;
}
}Salida:
Blocked: contains 'amazing'Funciones relacionadas
| Función | Mayúsculas | Busca desde |
|---|---|---|
stripos() | Insensible | Inicio → primera coincidencia |
strpos() | Sensible | Inicio → primera coincidencia |
strripos() | Insensible | Final → última coincidencia |
stristr() | Insensible | Devuelve la subcadena coincidente, no su posición |
Consulta también substr() para extraer texto una vez que tienes una posición, y str_replace() para reemplazos con distinción de mayúsculas.
Conclusión
stripos() devuelve la posición basada en cero de la primera coincidencia sin distinción de mayúsculas de una subcadena, o false si no hay ninguna. Recuerda comprobar el resultado con !== false para que una coincidencia en la posición 0 no se confunda con "no encontrado", usa $offset para encontrar ocurrencias posteriores, y recurre a strpos() cuando las mayúsculas importan.