Strrpos: примеры (PHP)
strrpos(string haystack, string needle [, int offset]): int|falseФункция strrpos в PHP
Функция strrpos предназначена для поиска позиции последнего вхождения подстроки в строку. Она полезна в ситуациях, когда требуется найти не первое, а именно конечное появление фрагмента текста.
Использование функции актуально при обработке путей к файлам, разборе строк с повторяющимися разделителями, извлечении расширений или поиске последнего элемента в структурированных данных. Например, определение последнего слэша в пути или точки в имени файла.
Функция принимает три параметра:
- haystack (string) — строка, в которой осуществляется поиск.
- needle (string) — искомая подстрока. В PHP 8, если needle не строка, происходит автоматическое преобразование к строке.
- 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, когда важен первый результат.
Аналоги strpos и strrpos, но без учета регистра символов.
Возвращает часть строки от первого вхождения подстроки до конца. Существует вариант strrchr для поиска последнего вхождения символа.
Выбор функции зависит от задачи: strrpos применяется для поиска с конца, strpos — с начала, а strstr — для получения подстроки.
Типичные ошибки
$string = 'abc';
if (strrpos($string, 'a')) {
echo 'Найдено';
} else {
echo 'Не найдено';
}Не найдено
Функция возвращает 0 при нахождении в начале, что интерпретируется как false. Следует использовать строгое сравнение.
// В 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.
Расширенные примеры использования
$filename = 'archive.tar.gz';
$lastDot = strrpos($filename, '.');
$extension = substr($filename, $lastDot + 1);
echo $extension;gz
$text = 'a|b|c|d|e|f';
// Найти позицию второго разделителя с конца
$pos = strrpos($text, '|', -6);
echo $pos;5
$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
$utf8 = 'Привет, мир!';
$pos = mb_strrpos($utf8, 'и');
echo $pos;9
Для многобайтовых кодировок следует использовать mb_strrpos.
Аналоги функции в других языках
text = 'apple, orange, apple, berry'
position = text.rfind('apple')
print(position)14
Метод rfind возвращает -1 при отсутствии подстроки, а не исключение.
let text = 'cat, dog, cat, mouse';
let position = text.lastIndexOf('cat');
console.log(position);11
Метод lastIndexOf возвращает -1 при неудачном поиске.
SELECT LOCATE('a', REVERSE('banana')) AS pos;Прямого аналога нет, но можно скомбинировать функции LOCATE и REVERSE.