Mb strrpos: примеры (PHP)

Функция mb_strrpos: примеры применения в PHP для работы с UTF-8
Раздел: Многобайтовые строки
mb_strrpos(string $haystack, string $needle, int $offset = 0, ?string $encoding = null): int|false

Описание функции mb_strrpos

Функция mb_strrpos() является частью расширения Multibyte String (mbstring) в PHP. Ее основная задача — определение позиции последнего вхождения подстроки в заданную строку, с поддержкой многобайтовых кодировок, таких как UTF-8. Это критически важно для корректной работы с текстами на языках, где символы могут состоять из нескольких байт (например, русский, китайский, японский).

Аргументы функции
  • haystack (string, обязательный): Исходная строка (стог сена), в которой производится поиск.
  • needle (string, обязательный): Искомая подстрока (иголка), позицию которой нужно найти.
  • offset (int, необязательный): Смещение начала поиска в строке haystack, заданное в количестве символов (не байтов). Если значение отрицательное, поиск начинается с конца строки, отсчитывая указанное количество символов.
  • encoding (string, необязательный): Кодировка входной строки и подстроки. Если не указана, используется внутренняя кодировка, которую можно установить функцией mb_internal_encoding().

Функция возвращает целочисленную позицию (отсчет с 0) последнего вхождения подстроки needle в строку haystack, либо false, если подстрока не найдена.

Простые примеры использования

Поиск с указанием кодировки
<?
$text = 'Программа и программист';
$pos = mb_strrpos($text, 'ам', 0, 'UTF-8');
echo $pos; // 5
?>
5
Поиск с отрицательным смещением
<?
$text = 'яблоко, груша, яблоко';
$pos = mb_strrpos($text, 'яб', -5, 'UTF-8');
echo $pos; // 0 (поиск в 'яблоко, груша, я')
?>
0
Когда подстрока не найдена
<?
$text = 'Пример строки';
$result = mb_strrpos($text, 'мир', 0, 'UTF-8');
var_dump($result);
?>
bool(false)

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

  • strrpos(): Аналог для однобайтовых кодировок. Работает только с ASCII или в случаях, когда символ равен одному байту. Для многобайтовых строк может возвращать некорректную позицию.
  • mb_strpos(): Находит позицию первого вхождения подстроки. Используется, когда требуется первое совпадение, а не последнее.
  • strripos() / mb_strripos(): Регистронезависимые версии функций strrpos и mb_strrpos. Поиск производится без учета регистра символов.

Выбор функции зависит от кодировки данных и требований к поиску. Для текстов на русском или других языках за пределами ASCII предпочтительны функции с префиксом mb_.

Частые ошибки

Сравнение результата без учета типа

Возвращаемое значение false при неудачном поиске может быть неверно интерпретировано как 0.

<?
$text = 'Тест';
$pos = mb_strrpos($text, 'сет', 0, 'UTF-8');
if ($pos) { // false интерпретируется как false
    echo 'Найдено';
} else {
    echo 'Не найдено';
}
?>
Не найдено
Неправильная кодировка
<?
// Если внутренняя кодировка не UTF-8, а строка в UTF-8
mb_internal_encoding('CP1251');
$text = 'Пример';
$pos = mb_strrpos($text, 'и'); // Может вернуть некорректный результат
?>

Всегда рекомендуется явно указывать кодировку, особенно при работе с пользовательским вводом.

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

  • PHP 8.0: Параметр encoding теперь может принимать значение null. Параметр needle теперь должен быть строкой. Передача типа, отличного от строки, вызывает ошибку TypeError. В более ранних версиях needle преобразовывался в целое число и интерпретировался как код символа.
  • PHP 7.1: Добавлена поддержка отрицательных значений для аргумента offset.

Расширенные примеры

Извлечение подстроки после последнего разделителя
Пример php
<?
$path = 'dir/subdir/file.txt';
$lastSlashPos = mb_strrpos($path, '/', 0, 'UTF-8');
if ($lastSlashPos !== false) {
    $filename = mb_substr($path, $lastSlashPos + 1);
    echo $filename; // file.txt
}
?>
file.txt
Поиск с учетом многобайтовых символов разной длины
Пример php
<?
$text = 'café и café';
$needle = 'é';
$pos = mb_strrpos($text, $needle, 0, 'UTF-8');
// strrpos($text, $needle) вернет позицию байта, а не символа.
echo $pos; // 9 (символ é во втором слове)
?>
9
Поиск с начала и до указанного смещения
Пример php
<?
$text = 'aaaa';
$pos = mb_strrpos($text, 'aa', 2, 'UTF-8'); // Поиск последнего 'aa' в 'aaa'
echo $pos; // 2
?>
2
Обработка строк с эмодзи
Пример php
<?
$text = 'Привет! ???? Пока! ????';
$pos = mb_strrpos($text, '????', 0, 'UTF-8');
echo $pos; // 17 (позиция второго эмодзи)
?>
17

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

Python

Метод str.rfind(). Работает с юникод-строками по умолчанию.

text = 'Программа и программист'
pos = text.rfind('ам')
print(pos)  # 5
5

Mb strrpos в Javascript

Метод String.lastIndexOf(). В JavaScript строки представлены в формате UTF-16, что позволяет корректно работать с большинством многобайтовых символов.

let text = 'Программа и программист';
let pos = text.lastIndexOf('ам');
console.log(pos); // 5
5

Mb strrpos в MySQL

Функция INSTR() с комбинацией функций для поиска последнего вхождения или LOCATE().

SELECT CHAR_LENGTH('Программа и программист') - LOCATE('ам', REVERSE('Программа и программист')) - CHAR_LENGTH('ам') + 1 AS pos;
5

PHP mb_strrpos function comments

En
Mb strrpos Find position of last occurrence of a string in a string