Mb strrpos: примеры (PHP)
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.
Расширенные примеры
<?
$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
<?
$text = 'café и café';
$needle = 'é';
$pos = mb_strrpos($text, $needle, 0, 'UTF-8');
// strrpos($text, $needle) вернет позицию байта, а не символа.
echo $pos; // 9 (символ é во втором слове)
?>9
<?
$text = 'aaaa';
$pos = mb_strrpos($text, 'aa', 2, 'UTF-8'); // Поиск последнего 'aa' в 'aaa'
echo $pos; // 2
?>2
<?
$text = 'Привет! ???? Пока! ????';
$pos = mb_strrpos($text, '????', 0, 'UTF-8');
echo $pos; // 17 (позиция второго эмодзи)
?>17
Аналоги в других языках
Метод str.rfind(). Работает с юникод-строками по умолчанию.
text = 'Программа и программист'
pos = text.rfind('ам')
print(pos) # 55
Mb strrpos в Javascript
Метод String.lastIndexOf(). В JavaScript строки представлены в формате UTF-16, что позволяет корректно работать с большинством многобайтовых символов.
let text = 'Программа и программист';
let pos = text.lastIndexOf('ам');
console.log(pos); // 55
Mb strrpos в MySQL
Функция INSTR() с комбинацией функций для поиска последнего вхождения или LOCATE().
SELECT CHAR_LENGTH('Программа и программист') - LOCATE('ам', REVERSE('Программа и программист')) - CHAR_LENGTH('ам') + 1 AS pos;5