strrpos

(PHP 4, PHP 5, PHP 7, PHP 8)

strrposCherche la position de la dernière occurrence d'une sous-chaîne dans une chaîne

Description

strrpos(string $haystack, string $needle, int $offset = 0): int|false

Cherche la position numérique de la dernière occurrence de needle dans la chaîne haystack.

Liste de paramètres

haystack

La chaîne dans laquelle chercher.

needle

La chaîne à rechercher.

Antérieur à PHP 8.0.0, si needle n'est pas une chaîne de caractères, elle est convertie en un entier et appliqué en tant que valeur ordinal d'un caractère. Ce comportement est obsolète à partir de PHP 7.3.0, et se fier à celui-ci est fortement déconseillé. En fonction du comportement attendu, needle doit être transtypé explicitement en une chaîne de caractère, ou un appel explicite à chr() doit être exécuté.

offset

Si zéro ou positif, la recherche est effectuée de gauche à droite omettant les premiers offset octets de haystack.

Si négatif, la recherche commence à offset octets de la droite au lieu de depuis le début de haystack. La recherche s'effectue de droite à gauche, cherchant la première occurrence de needle à partir de l'octet sélectionné.

Note:

Ceci est effectivement équivalent à la recherche de la dernière occurrence de needle à ou avant les derniers offset octets.

Valeurs de retour

Retourne la position de la dernière occurrence de needle relativement au début de la chaîne haystack (indépendamment de la direction de recherche ou de l'offset).

Note: Les positions des chaîne de caractères débutent à 0, et pas à 1.

Retourne false si la needle n'a pas été trouvée.

Avertissement

Cette fonction peut retourner false, mais elle peut aussi retourner une valeur équivalent à false. Veuillez lire la section sur les booléens pour plus d'informations. Utilisez l'opérateur === pour tester la valeur de retour exacte de cette fonction.

Historique

Version Description
8.0.0 needle accepte désormais une chaîne vide.
8.0.0 Passing an entier as needle is no longer supported.
7.3.0 Passer un entier comme before_needle a été rendu obsolète.

Exemples

Exemple #1 Vérifie si une occurrence est trouvée dans une chaîne

Il est facile de faire une erreur quant à la valeur retournée entre "caractère trouvé à la position 0" et "caractère non trouvé". Voici comme détecter cette différence :

<?php

$pos
= strrpos($mystring, "b");
if (
$pos === false) { // note : 3 signes "="
// non trouvé ...
}

?>

Exemple #2 Recherche avec des positions

<?php
$foo
= "0123456789a123456789b123456789c";

// Chercher pour '0' depuis l'octet 0 (depuis le début)
var_dump(strrpos($foo, '0', 0));

// Chercher pour '0' depuis le 1er octet (après l'octet "0")
var_dump(strrpos($foo, '0', 1));

// Chercher pour '7' depuis le 21ème octet (après l'octet 20)
var_dump(strrpos($foo, '7', 20));

// Chercher pour '7' depuis le 29ème octet (après l'octet 28)
var_dump(strrpos($foo, '7', 28));

// Chercher pour '7' de droite à gauche depuis le 5ème octet depuis la fin
var_dump(strrpos($foo, '7', -5));

// Chercher pour 'c' de droite à gauche depuis le 2ème octet depuis la fin
var_dump(strrpos($foo, 'c', -2));

// Chercher pour '9c' de droite à gauche depuis le 2ème octet depuis la fin
var_dump(strrpos($foo, '9c', -2));
?>

L'exemple ci-dessus va afficher :

int(0)
bool(false)
int(27)
bool(false)
int(17)
bool(false)
int(29)

Voir aussi

  • strpos() - Cherche la position de la première occurrence dans une chaîne
  • stripos() - Recherche la position de la première occurrence dans une chaîne, sans tenir compte de la casse
  • strripos() - Cherche la position de la dernière occurrence d'une chaîne contenue dans une autre, de façon insensible à la casse
  • strrchr() - Trouve la dernière occurrence d'un caractère dans une chaîne
  • substr() - Retourne un segment de chaîne

add a note

User Contributed Notes 7 notes

up
77
brian at enchanter dot net
17 years ago
The documentation for 'offset' is misleading.

It says, "offset may be specified to begin searching an arbitrary number of characters into the string. Negative values will stop searching at an arbitrary point prior to the end of the string."

This is confusing if you think of strrpos as starting at the end of the string and working backwards.

A better way to think of offset is:

- If offset is positive, then strrpos only operates on the part of the string from offset to the end. This will usually have the same results as not specifying an offset, unless the only occurences of needle are before offset (in which case specifying the offset won't find the needle).

- If offset is negative, then strrpos only operates on that many characters at the end of the string. If the needle is farther away from the end of the string, it won't be found.

If, for example, you want to find the last space in a string before the 50th character, you'll need to do something like this:

strrpos($text, " ", -(strlen($text) - 50));

If instead you used strrpos($text, " ", 50), then you would find the last space between the 50th character and the end of the string, which may not have been what you were intending.
up
3
dave at pixelmetrics dot com
5 years ago
The description of offset is wrong. Here’s how it works, with supporting examples.

Offset effects both the starting point and stopping point of the search. The direction is always right to left. (The description wrongly says PHP searches left to right when offset is positive.)

Here’s how it works:
When offset is positive, PHP searches right to left from the end of haystack to offset. This ignores the left side of haystack.

When offset is negative, PHP searches right to left, starting offset bytes from the end, to the start of haystack. This ignores the right side of haystack.

Example 1:
$foo = ‘aaaaaaaaaa’;
var_dump(strrpos($foo, 'a', 5));
Result: int(10)

Example 2:
$foo = "aaaaaa67890";
var_dump(strrpos($foo, 'a', 5));
Result: int(5)

Conclusion: When offset is positive, PHP searches right to left from the end of haystack.

Example 3:
$foo = "aaaaa567890";
var_dump(strrpos($foo, 'a', 5));
Result: bool(false)

Conclusion: When offset is positive, PHP stops searching at offset.

Example 4:
$foo = ‘aaaaaaaaaa’;
var_dump(strrpos($foo, 'a', -5));
Result: int(6)

Conclusion: When offset is negative, PHP searches right to left, starting offset bytes from the end.

Example 5:
$foo = "a234567890";
var_dump(strrpos($foo, 'a', -5));
Result: int(0)

Conclusion: When offset is negative, PHP searches right to left, all the way to the start of haystack.
up
6
Daniel Brinca
17 years ago
Here is a simple function to find the position of the next occurrence of needle in haystack, but searching backwards (lastIndexOf type function):

//search backwards for needle in haystack, and return its position
function rstrpos ($haystack, $needle, $offset){
$size = strlen ($haystack);
$pos = strpos (strrev($haystack), $needle, $size - $offset);

if ($pos === false)
return false;

return $size - $pos;
}

Note: supports full strings as needle
up
2
david dot mann at djmann dot co dot uk
6 years ago
Ten years on, Brian's note is still a good overview of how offsets work, but a shorter and simpler summary is:

strrpos($x, $y, 50); // 1: this tells strrpos() when to STOP, counting from the START of $x
strrpos($x, $y, -50); // 2: this tells strrpos() when to START, counting from the END of $x

Or to put it another way, a positive number lets you search the rightmost section of the string, while a negative number lets you search the leftmost section of the string.

Both these variations are useful, but picking the wrong one can cause some highly confusing results!
up
-3
ZaraWebFX
21 years ago
this could be, what derek mentioned:

<?
function cut_last_occurence($string,$cut_off) {
return strrev(substr(strstr(strrev($string), strrev($cut_off)),strlen($cut_off)));
}

// example: cut off the last occurence of "limit"
$str = "select delta_limit1, delta_limit2, delta_limit3 from table limit 1,7";
$search = " limit";
echo $str."\n";
echo cut_last_occurence($str,"limit");
?>
up
-4
php NO at SPAMMERS willfris SREMMAPS dot ON nl
18 years ago
<?php
/*******
** Maybe the shortest code to find the last occurence of a string, even in php4
*******/
function stringrpos($haystack,$needle,$offset=NULL)
{
return
strlen($haystack)
-
strpos( strrev($haystack) , strrev($needle) , $offset)
-
strlen($needle);
}
// @return -> chopped up for readability.
?>
up
-4
genetically altered mastermind at gmail
19 years ago
Very handy to get a file extension:
$this->data['extension'] = substr($this->data['name'],strrpos($this->data['name'],'.')+1);
To Top