strrpos()
La función strrpos() en PHP encuentra la última ocurrencia de una subcadena en una cadena y devuelve su posición basada en cero.
Introducción
La función strrpos() encuentra la última ocurrencia de una subcadena dentro de una cadena y devuelve su posición basada en cero (el índice de su primer carácter). Piénsela como la imagen especular de strpos(), que encuentra la primera ocurrencia: strpos() escanea de izquierda a derecha, mientras que strrpos() reporta la coincidencia más a la derecha.
Se usa strrpos() cuando le interesa el final de una cadena — obtener la extensión de un archivo después del último punto, dividir una ruta en su última barra, o eliminar todo lo que hay después del último separador.
Esta página cubre la sintaxis, el problema fácil de pasar por alto con false/0, cómo el parámetro $offset (incluyendo valores negativos) restringe la búsqueda, y el hermano sin distinción de mayúsculas strripos().
Sintaxis
strrpos(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 desea encontrar. |
$offset | Opcional. Cambia dónde comienza o termina la búsqueda. Un offset positivo inicia la búsqueda a tantos caracteres desde el inicio; un offset negativo detiene la búsqueda a tantos caracteres antes del final. |
Valor de retorno: la posición entera (contando desde 0) de la última coincidencia, o false si $needle nunca aparece en $haystack. La posición es un desplazamiento en bytes, por lo que para texto multibyte (acentos UTF-8, emoji) use mb_strrpos() en su lugar.
Ejemplo de Uso
A continuación se muestra un ejemplo de uso de la función strrpos() en PHP:
Ejemplo de PHP strrpos()
"Hello World" contiene dos caracteres o — en el índice 4 y en el índice 7. Como strrpos() reporta el último, la salida es:
Found last occurrence of 'o' in 'Hello World' at position 7Siempre compare con === / !== false
Este es el error que afecta a todos. Cuando la coincidencia está al comienzo de la cadena, strrpos() devuelve 0, y PHP trata 0 como un valor falso. Una comprobación no estricta como if ($result) concluiría incorrectamente "no encontrado":
<?php
// "h" is at position 0, so strrpos returns 0
$pos = strrpos("hello", "h");
if ($pos == false) { // WRONG: 0 == false is true
echo "not found"; // this prints, even though "h" WAS found
} else {
echo "found at $pos";
}La solución es el operador estricto !== false (usado en el primer ejemplo), que distingue el entero 0 del boolean false.
Restringir la búsqueda con $offset
Un offset negativo es la forma más útil: le indica a strrpos() que deje de buscar esa cantidad de caracteres antes del final, lo cual es útil para ignorar una parte final de la cadena.
<?php
$path = "a/b/c/d";
// Last slash overall:
echo strrpos($path, "/"); // 5
// Last slash, ignoring the final 2 chars ("/d"):
echo "\n";
echo strrpos($path, "/", -3); // 3Un offset positivo comienza la búsqueda a tantos caracteres desde el inicio, omitiendo las coincidencias anteriores.
Búsqueda sin distinción de mayúsculas: strripos()
strrpos() distingue entre mayúsculas y minúsculas — strrpos("FOO", "o") devuelve false. Cuando el caso no debe importar, use strripos(), que tiene la misma firma pero coincide independientemente del caso:
<?php
$str = "PHP is the Programming language: php";
echo strrpos($str, "php"); // 33 (only the lowercase one matches)
echo "\n";
echo strripos($str, "php"); // 33 (right-most match, ignoring case)Funciones Relacionadas
strpos()— posición de la primera ocurrencia.stripos()— primera ocurrencia, sin distinción de mayúsculas.substr()— extrae la parte de la cadena después de la posición encontrada.str_replace()— reemplaza ocurrencias sin necesitar su posición.
Conclusión
strrpos() devuelve la posición en bytes de la última ocurrencia de una subcadena, o false cuando no existe ninguna — así que siempre compare su resultado con !== false. Combínela con un $offset negativo para ignorar texto final, cambie a strripos() para coincidencias sin distinción de mayúsculas, y use mb_strrpos() cuando la cadena contenga caracteres multibyte.