Strrpos: примеры (PHP)

Функция strrpos в PHP: поиск позиции с конца строки
Раздел: Работа со строками
strrpos(string haystack, string needle [, int offset]): int|false

Функция strrpos в PHP

Функция strrpos предназначена для поиска позиции последнего вхождения подстроки в строку. Она полезна в ситуациях, когда требуется найти не первое, а именно конечное появление фрагмента текста.

Назначение и основные случаи применения

Использование функции актуально при обработке путей к файлам, разборе строк с повторяющимися разделителями, извлечении расширений или поиске последнего элемента в структурированных данных. Например, определение последнего слэша в пути или точки в имени файла.

Аргументы функции

Функция принимает три параметра:

  1. haystack (string) — строка, в которой осуществляется поиск.
  2. needle (string) — искомая подстрока. В PHP 8, если needle не строка, происходит автоматическое преобразование к строке.
  3. offset (int, необязательный) — если указан, поиск начинается с начала строки, но учитывается только последнее вхождение, найденное не позднее этого смещения. Отрицательное значение указывает смещение от конца строки.

Примеры применения strrpos

$string = 'Дерево, камень, дерево, лист';
$pos = strrpos($string, 'дерево');
var_dump($pos);
int(17)

Поиск без учета регистра:

$pos = strripos($string, 'ДЕРЕВО');
var_dump($pos);
int(17)

Использование отрицательного смещения:

$string = 'test.test.test.zip';
$pos = strrpos($string, '.', -5);
var_dump($pos);
int(9)

Случай, когда подстрока не найдена:

$pos = strrpos($string, 'pdf');
var_dump($pos);
bool(false)

Похожие функции в PHP

В PHP существует несколько функций для поиска подстрок:

Находит позицию первого вхождения подстроки. Используется чаще, чем strrpos, когда важен первый результат.

stripos и strripos

Аналоги strpos и strrpos, но без учета регистра символов.

Возвращает часть строки от первого вхождения подстроки до конца. Существует вариант strrchr для поиска последнего вхождения символа.

Выбор функции зависит от задачи: strrpos применяется для поиска с конца, strpos — с начала, а strstr — для получения подстроки.

Типичные ошибки

Сравнение результата без учета типа
$string = 'abc';
if (strrpos($string, 'a')) {
echo 'Найдено';
} else {
echo 'Не найдено';
}
Не найдено

Функция возвращает 0 при нахождении в начале, что интерпретируется как false. Следует использовать строгое сравнение.

Передача пустой строки в needle до PHP 8
// В PHP 7 и ниже
$pos = strrpos('test', '');
var_dump($pos);
bool(false)

В PHP 8 вызов с пустой строкой вызывает TypeError, что предотвращает неоднозначность.

Изменения в последних версиях PHP

В PHP 8.0 произошли значительные изменения:

  • Параметр needle теперь всегда интерпретируется как строка. Передача числа или другого типа приводит к его преобразованию в строку, а не к использованию его кода символа.
  • Передача пустой строки в needle вызывает TypeError, тогда как ранее возвращался false.
  • Улучшены сообщения об ошибках при передаче неверного количества аргументов.

В PHP 7.3 добавлена поддержка отрицательных значений для аргумента offset.

Расширенные примеры использования

Извлечение расширения файла
Пример php
$filename = 'archive.tar.gz';
$lastDot = strrpos($filename, '.');
$extension = substr($filename, $lastDot + 1);
echo $extension;
gz
Поиск с учетом смещения
Пример php
$text = 'a|b|c|d|e|f';
// Найти позицию второго разделителя с конца
$pos = strrpos($text, '|', -6);
echo $pos;
5
Обработка многострочного текста
Пример php
$log = "ERROR: File not found\nINFO: Process started\nERROR: Timeout occurred\n";
$lastError = strrpos($log, 'ERROR:');
if ($lastError !== false) {
$line = substr($log, $lastError, strpos($log, "\n", $lastError) - $lastError);
echo $line;
}
ERROR: Timeout occurred
Работа с UTF-8
Пример php
$utf8 = 'Привет, мир!';
$pos = mb_strrpos($utf8, 'и');
echo $pos;
9

Для многобайтовых кодировок следует использовать mb_strrpos.

Аналоги функции в других языках

Python
text = 'apple, orange, apple, berry'
position = text.rfind('apple')
print(position)
14

Метод rfind возвращает -1 при отсутствии подстроки, а не исключение.

JavaScript
let text = 'cat, dog, cat, mouse';
let position = text.lastIndexOf('cat');
console.log(position);
11

Метод lastIndexOf возвращает -1 при неудачном поиске.

MySQL
SELECT LOCATE('a', REVERSE('banana')) AS pos;

Прямого аналога нет, но можно скомбинировать функции LOCATE и REVERSE.

PHP strrpos function comments

En
Strrpos Find the position of the last occurrence of a substring in a string