strrpos()
Функция strrpos() в PHP находит последнее вхождение подстроки в строке и возвращает её позицию.
Введение
Функция strrpos() находит последнее вхождение подстроки внутри строки и возвращает её позицию (индекс первого символа), отсчитываемую от нуля. Думайте о ней как о зеркальном отражении strpos(), которая находит первое вхождение: strpos() сканирует слева направо, а strrpos() возвращает позицию самого правого совпадения.
strrpos() используется, когда вас интересует конец строки — например, получить расширение файла после последней точки, разбить путь по последнему слешу или отрезать всё после последнего разделителя.
На этой странице рассматриваются синтаксис, часто упускаемый из виду подводный камень с false/0, то, как параметр $offset (включая отрицательные значения) сужает область поиска, и регистронезависимый аналог strripos().
Синтаксис
strrpos(string $haystack, string $needle, int $offset = 0): int|false| Параметр | Описание |
|---|---|
$haystack | Строка, в которой выполняется поиск. |
$needle | Подстрока, которую нужно найти. |
$offset | Необязательный. Изменяет начальную или конечную точку поиска. Положительное смещение начинает поиск с указанного количества символов от начала; отрицательное смещение заканчивает поиск за указанное количество символов до конца. |
Возвращаемое значение: целочисленная позиция (с отсчётом от 0) последнего совпадения или false, если $needle не встречается в $haystack. Позиция является смещением в байтах, поэтому для многобайтового текста (UTF-8 акценты, эмодзи) используйте mb_strrpos().
Пример использования
Вот пример использования функции strrpos() в PHP:
Пример PHP strrpos()
"Hello World" содержит два символа o — на индексе 4 и на индексе 7. Поскольку strrpos() возвращает позицию последнего из них, вывод будет следующим:
Found last occurrence of 'o' in 'Hello World' at position 7Всегда сравнивайте с === / !== false
Это ошибка, на которую попадаются все. Когда совпадение находится в самом начале строки, strrpos() возвращает 0, а PHP считает 0 ложным значением. Нестрогая проверка вида if ($result) ошибочно сделает вывод «не найдено»:
<?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";
}Исправление — строгий оператор !== false (используемый в первом примере), который отличает целое число 0 от логического false.
Сужение поиска с помощью $offset
Отрицательное смещение является наиболее полезной формой: оно указывает strrpos() прекратить поиск за указанное количество символов до конца, что удобно для игнорирования конечной части строки.
<?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); // 3Положительное смещение начинает поиск с указанного количества символов от начала, пропуская более ранние совпадения.
Регистронезависимый поиск: strripos()
strrpos() чувствительна к регистру — strrpos("FOO", "o") возвращает false. Когда регистр не важен, используйте strripos(), которая имеет идентичную сигнатуру, но находит совпадения независимо от регистра:
<?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)Связанные функции
strpos()— позиция первого вхождения.stripos()— первое вхождение без учёта регистра.substr()— извлечь часть строки после найденной позиции.str_replace()— заменить вхождения без необходимости знать их позицию.
Заключение
strrpos() возвращает байтовую позицию последнего вхождения подстроки или false, если вхождение не найдено — поэтому всегда сравнивайте результат с !== false. Используйте отрицательный $offset, чтобы игнорировать конечную часть текста, переключайтесь на strripos() для регистронезависимого поиска, и применяйте mb_strrpos(), когда строка содержит многобайтовые символы.