strrpos()
La fonction strrpos() en PHP recherche la dernière occurrence d'une sous-chaîne dans une chaîne et retourne sa position en base zéro.
Introduction
La fonction strrpos() recherche la dernière occurrence d'une sous-chaîne dans une chaîne et retourne sa position en base zéro (l'index de son premier caractère). Considérez-la comme l'image miroir de strpos(), qui recherche la première occurrence : strpos() parcourt de gauche à droite, tandis que strrpos() retourne la correspondance la plus à droite.
Vous utilisez strrpos() lorsque vous vous intéressez à la fin d'une chaîne — obtenir une extension de fichier après le dernier point, diviser un chemin sur son dernier slash, ou supprimer tout ce qui se trouve après le dernier séparateur.
Cette page couvre la syntaxe, le piège facile à manquer avec false/0, comment le paramètre $offset (y compris les valeurs négatives) restreint la recherche, et le cousin insensible à la casse strripos().
Syntaxe
strrpos(string $haystack, string $needle, int $offset = 0): int|false| Paramètre | Description |
|---|---|
$haystack | La chaîne dans laquelle effectuer la recherche. |
$needle | La sous-chaîne à rechercher. |
$offset | Facultatif. Modifie l'endroit où la recherche commence/se termine. Un offset positif démarre la recherche à ce nombre de caractères depuis le début ; un offset négatif arrête la recherche à ce nombre de caractères avant la fin. |
Valeur de retour : la position entière (à partir de 0) de la dernière correspondance, ou false si $needle n'apparaît jamais dans $haystack. La position est un décalage en octets, donc pour un texte multi-octets (accents UTF-8, emoji), utilisez plutôt mb_strrpos().
Exemple d'utilisation
Voici un exemple d'utilisation de la fonction strrpos() en PHP :
Exemple de strrpos() en PHP
"Hello World" contient deux caractères o — aux index 4 et 7. Comme strrpos() retourne le dernier, la sortie est :
Found last occurrence of 'o' in 'Hello World' at position 7Toujours comparer avec === / !== false
C'est le bug qui piège tout le monde. Lorsque la correspondance se trouve au tout début de la chaîne, strrpos() retourne 0, et PHP traite 0 comme faux. Une vérification lâche comme if ($result) conclurait alors à tort « non trouvé » :
<?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 solution est l'opérateur strict !== false (utilisé dans le premier exemple), qui distingue l'entier 0 du booléen false.
Restreindre la recherche avec $offset
Un offset négatif est la forme la plus utile : il indique à strrpos() d'arrêter la recherche à ce nombre de caractères avant la fin, ce qui est pratique pour ignorer une portion de fin de chaîne.
<?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 positif commence la recherche à ce nombre de caractères depuis le début, en ignorant les correspondances antérieures.
Recherche insensible à la casse : strripos()
strrpos() est sensible à la casse — strrpos("FOO", "o") retourne false. Lorsque la casse n'a pas d'importance, utilisez strripos(), qui a la même signature mais correspond indépendamment de la casse :
<?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)Fonctions associées
strpos()— position de la première occurrence.stripos()— première occurrence, insensible à la casse.substr()— extrait la partie de la chaîne après la position trouvée.str_replace()— remplace les occurrences sans avoir besoin de leur position.
Conclusion
strrpos() retourne la position en octets de la dernière occurrence d'une sous-chaîne, ou false s'il n'y en a pas — comparez donc toujours son résultat avec !== false. Combinez-la avec un $offset négatif pour ignorer le texte en fin de chaîne, utilisez strripos() pour une correspondance insensible à la casse, et préférez mb_strrpos() lorsque la chaîne contient des caractères multi-octets.