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

Поиск подстрок в PHP с помощью mb_strripos
Раздел: Многобайтовые строки
mb_strripos(string $haystack, string $needle, int $offset = 0, ?string $encoding = null): int|false
Описание функции mb_strripos

Функция mb_strripos выполняет поиск последнего вхождения подстроки в строку с учетом многобайтовых кодировок, не учитывая регистр символов. Она используется при работе с текстами на языках, где символы могут занимать более одного байта (UTF-8, CP1251 и другие).

Аргументы функции
  • haystack (строка) – исходная строка, в которой выполняется поиск.
  • needle (строка) – подстрока для поиска.
  • offset (целое число, необязательный) – позиция в символах (не в байтах), с которой начинается поиск. Отрицательное значение указывает позицию от конца строки.
  • encoding (строка, необязательный) – кодировка строк. Если не указана, используется внутренняя кодировка.

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

Примеры использования
Базовый поиск
echo mb_strripos("Привет, мир!", "МИР");
8
Поиск с отрицательным смещением
echo mb_strripos("тест тест тест", "ТЕСТ", -5);
5
Указание кодировки
echo mb_strripos("Пример строки", "СТРОКИ", 0, "UTF-8");
7
Похожие функции в PHP
  • mb_strrpos – поиск последнего вхождения с учетом регистра.
  • stripos – поиск первого вхождения без учета регистра, но без поддержки многобайтовых кодировок.
  • strripos – поиск последнего вхождения без учета регистра, но без поддержки многобайтовых кодировок.

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

Типичные ошибки
Использование неверной кодировки
echo mb_strripos("абвгде", "Д", 0, "ASCII");
false

Указание неподходящей кодировки может привести к некорректным результатам.

Сравнение с false
if (mb_strripos("текст", "слово") == false) {
    echo "Не найдено";
}

Такой код может вызвать проблему, так как позиция 0 также интерпретируется как false. Рекомендуется использовать строгое сравнение ===.

Изменения в PHP 8

В PHP 8 параметр encoding стал необязательным и может принимать значение null. Также функция теперь выбрасывает исключение ValueError при передаче недопустимого смещения.

Расширенные примеры
Поиск всех вхождений подстроки
Пример php
$text = "Тест, тест, ТЕСТ";
$needle = "тест";
$lastPos = 0;
$positions = [];
while (($lastPos = mb_strripos($text, $needle, $lastPos)) !== false) {
    $positions[] = $lastPos;
    $lastPos = $lastPos - mb_strlen($text);
}
print_r($positions);
Array
(
    [0] => 13
    [1] => 7
    [2] => 0
)
Поиск с использованием различных кодировок
Пример php
$text = "Русский текст и English text";
$pos_utf8 = mb_strripos($text, "TEXT", 0, "UTF-8");
$pos_cp1251 = mb_strripos(iconv("UTF-8", "CP1251", $text), iconv("UTF-8", "CP1251", "TEXT"), 0, "CP1251");
echo "UTF-8: $pos_utf8, CP1251: $pos_cp1251";
UTF-8: 22, CP1251: 22
Обработка сложных символов
Пример php
$text = "café café";
$pos = mb_strripos($text, "CAFÉ");
echo $pos;
6
Аналоги в других языках

Mb strripos в Python

text = "Пример строки"
position = text.lower().rfind("СТРОКИ".lower())
print(position)
7

Mb strripos в Javascript

let text = "Пример строки";
let position = text.toLowerCase().lastIndexOf("СТРОКИ".toLowerCase());
console.log(position);
7

Mb strripos в MySQL

SELECT LENGTH('Пример строки') - LOCATE(REVERSE('СТРОКИ'), REVERSE('Пример строки')) + 1;

В MySQL нет прямой функции, поиск осуществляется через комбинацию LOCATE и REVERSE.

PHP mb_strripos function comments

En
Mb strripos Performs a case-insensitive multi-byte string search for the last occurrence of a string within another