strrpos()
A função strrpos() em PHP localiza a última ocorrência de uma substring em uma string e retorna sua posição baseada em zero.
Introdução
A função strrpos() encontra a última ocorrência de uma substring dentro de uma string e retorna sua posição baseada em zero (o índice do seu primeiro caractere). Pense nela como a imagem espelhada de strpos(), que encontra a primeira ocorrência: strpos() percorre da esquerda para a direita, enquanto strrpos() reporta a correspondência mais à direita.
Você recorre ao strrpos() sempre que se preocupa com o final de uma string — obter uma extensão de arquivo após o último ponto, dividir um caminho na última barra, ou remover tudo após o último separador.
Esta página aborda a sintaxe, a armadilha fácil de ignorar com false/0, como o parâmetro $offset (incluindo valores negativos) restringe a busca, e o irmão sem distinção de maiúsculas/minúsculas strripos().
Sintaxe
strrpos(string $haystack, string $needle, int $offset = 0): int|false| Parâmetro | Descrição |
|---|---|
$haystack | A string em que se pesquisa. |
$needle | A substring a ser pesquisada. |
$offset | Opcional. Altera onde a pesquisa começa/termina. Um offset positivo inicia a busca tantos caracteres a partir do início; um offset negativo encerra a busca tantos caracteres antes do final. |
Valor de retorno: a posição inteira (contando a partir de 0) da última correspondência, ou false se $needle nunca aparecer em $haystack. A posição é um deslocamento em bytes, portanto, para texto multibyte (acentos UTF-8, emoji) use mb_strrpos().
Exemplo de Uso
Aqui está um exemplo de uso da função strrpos() em PHP:
Exemplo de strrpos() em PHP
"Hello World" contém dois caracteres o — nos índices 4 e 7. Como strrpos() reporta o último, a saída é:
Found last occurrence of 'o' in 'Hello World' at position 7Sempre compare com === / !== false
Este é o bug que pega todo mundo. Quando a correspondência está no início da string, strrpos() retorna 0, e o PHP trata 0 como falso. Uma verificação solta como if ($result) concluiria erroneamente "não 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";
}A correção é o operador estrito !== false (usado no primeiro exemplo), que distingue o inteiro 0 do boolean false.
Restringindo a busca com $offset
Um offset negativo é a forma mais útil: ele diz ao strrpos() para parar de pesquisar tantos caracteres antes do final, o que é útil para ignorar uma parte final da string.
<?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); // 3Um offset positivo inicia a busca tantos caracteres a partir do início, ignorando correspondências anteriores.
Busca sem distinção de maiúsculas/minúsculas: strripos()
strrpos() diferencia maiúsculas de minúsculas — strrpos("FOO", "o") retorna false. Quando a capitalização não importa, use strripos(), que possui assinatura idêntica mas corresponde independentemente da capitalização:
<?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)Funções relacionadas
strpos()— posição da primeira ocorrência.stripos()— primeira ocorrência, sem distinção de maiúsculas/minúsculas.substr()— extrai a parte da string após a posição encontrada.str_replace()— substitui ocorrências sem precisar de sua posição.
Conclusão
strrpos() retorna a posição em bytes da última ocorrência de uma substring, ou false quando não há nenhuma — portanto, sempre compare seu resultado com !== false. Combine-o com um $offset negativo para ignorar texto final, mude para strripos() para correspondência sem distinção de maiúsculas/minúsculas, e use mb_strrpos() quando a string contiver caracteres multibyte.