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

Функция mb_strrichr: многобайтовый поиск подстрок
Раздел: Многобайтовые строки
mb_strrichr(string $haystack, string $needle, bool $before_needle = false, ?string $encoding = null): string|false

Функция mb_strrichr в PHP

Функция mb_strrichr выполняет поиск последнего вхождения подстроки в строке с учётом многобайтовых кодировок, без учёта регистра символов. Эта функция является регистронезависимым аналогом mb_strrchr и работает корректно с символами, занимающими более одного байта (например, в кодировках UTF-8, UTF-16).

Когда используется функция

Функция применяется при необходимости найти последнее вхождение подстроки в строку, когда регистр символов не имеет значения, а данные могут содержать символы за пределами ASCII. Типичные сценарии включают обработку пользовательского ввода на разных языках, парсинг текстов с международными символами.

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

Функция имеет три обязательных и один необязательный аргумент:

  • haystack (обязательный) — строка, в которой выполняется поиск.
  • needle (обязательный) — подстрока, которую необходимо найти.
  • before_needle (обязательный) — логический параметр, определяющий возвращаемую часть строки. Если true, функция возвращает часть строки до последнего вхождения подстроки (исключая саму подстроку). Если false — возвращает часть строки, начиная с последнего вхождения подстроки (включая подстроку).
  • encoding (необязательный) — кодировка входной строки. Если не указана, используется внутренняя кодировка скрипта или значение, установленное функцией mb_internal_encoding().

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

Поиск с возвратом конца строки

Поиск последнего вхождения подстроки без учёта регистра и возврат части строки, начиная с этого вхождения.

<?
$text = 'Привет, мир! Мир прекрасен.';
$result = mb_strrichr($text, 'МИР', false, 'UTF-8');
echo $result;
?>
Мир прекрасен.
Поиск с возвратом начала строки

Поиск последнего вхождения подстроки и возврат части строки до этого вхождения.

<?
$text = 'Яблоко, апельсин, яблоко, виноград';
$result = mb_strrichr($text, 'ЯБЛОКО', true, 'UTF-8');
echo $result;
?>
Яблоко, апельсин, 
Использование кодировки по умолчанию

Поиск без явного указания кодировки, когда внутренняя кодировка скрипта уже настроена.

<?
mb_internal_encoding('UTF-8');
$text = 'Пример текста с Ç и É';
$result = mb_strrichr($text, 'ç', false);
echo $result;
?>
Ç и É

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

Аналог функции mb_strrichr, но с учётом регистра символов. Используется, когда необходимо различать заглавные и строчные буквы при поиске последнего вхождения.

Выполняет поиск первого вхождения подстроки без учёта регистра. Отличие от mb_strrichr заключается в поиске первого, а не последнего совпадения.

strripos

Возвращает позицию последнего вхождения подстроки без учёта регистра, но для однобайтовых строк. Для многобайтовых строк рекомендуется использовать mb_strripos.

Когда какие функции предпочтительнее
  • mb_strrichr — для поиска последнего вхождения без учёта регистра в многобайтовых строках.
  • mb_strrchr — для регистрозависимого поиска последнего вхождения в многобайтовых строках.
  • mb_stristr — для регистронезависимого поиска первого вхождения.
  • strripos или mb_strripos — когда требуется только позиция вхождения, а не часть строки.

Типичные ошибки при использовании

Некорректная кодировка

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

<?
$text = 'Текст в UTF-8';
// Неверная кодировка для строки в UTF-8
$result = mb_strrichr($text, 'текст', false, 'ISO-8859-1');
var_dump($result);
?>
bool(false)
Пустая строка или подстрока

Если подстрока пустая, функция вернёт false.

<?
$text = 'Пример';
$result = mb_strrichr($text, '', false, 'UTF-8');
var_dump($result);
?>
bool(false)
Использование без расширения mbstring

При вызове функции без установленного расширения mbstring возникает фатальная ошибка.

Fatal error: Uncaught Error: Call to undefined function mb_strrichr()

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

В PHP 8.0 функция mb_strrichr стала более строгой к типам передаваемых аргументов. Передача аргументов несовместимых типов теперь вызывает ошибку TypeError. В предыдущих версиях PHP такие аргументы могли неявно преобразовываться.

В PHP 8.2 не было внесено значительных изменений в работу этой функции. Однако рекомендуется всегда указывать кодировку явно для избежания неоднозначностей.

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

Извлечение расширения файла без учёта регистра
Пример php
<?
$filename = 'Документ.ТХТ';
// Ищем последнюю точку и возвращаем расширение
$extension = mb_strrichr($filename, '.', false, 'UTF-8');
if ($extension !== false) {
    echo 'Расширение файла: ' . $extension;
}
?>
Расширение файла: .ТХТ
Разделение пути к файлу на директорию и имя
Пример php
<?
$path = '/home/user/Документы/файл.pdf';
// Ищем последний слеш
$dir = mb_strrichr($path, '/', true, 'UTF-8');
$file = mb_strrichr($path, '/', false, 'UTF-8');
echo 'Директория: ' . $dir . "\n";
echo 'Имя файла: ' . $file;
?>
Директория: /home/user/Документы
Имя файла: /файл.pdf
Обработка многострочного текста
Пример php
<?
$text = "Первая строка\nВторая СТРОКА\nтретья строка";
// Поиск последнего вхождения 'строка' без учёта регистра
$result = mb_strrichr($text, 'СТРОКА', false, 'UTF-8');
echo $result;
?>
строка
Поиск с учётом диакритических знаков
Пример php
<?
$text = 'café café';
// Поиск последнего вхождения 'cafe' без учёта акцентов
$result = mb_strrichr($text, 'cafe', false, 'UTF-8');
echo $result;
?>
café

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

Python

В Python нет прямой аналогии, но можно использовать комбинацию методов lower() и rfind() для строк в Юникоде.

text = 'Привет, мир! Мир прекрасен.'
needle = 'МИР'
index = text.lower().rfind(needle.lower())
if index != -1:
    result = text[index:]
    print(result)
Мир прекрасен.

Mb strrichr в Javascript

В JavaScript для строк Юникод можно использовать метод lastIndexOf() с предварительным приведением к нижнему регистру.

let text = 'Привет, мир! Мир прекрасен.';
let needle = 'МИР';
let lowerText = text.toLowerCase();
let lowerNeedle = needle.toLowerCase();
let index = lowerText.lastIndexOf(lowerNeedle);
if (index !== -1) {
    let result = text.substring(index);
    console.log(result);
}
Мир прекрасен.

Mb strrichr в MySQL

В MySQL функция LOCATE() не поддерживает регистронезависимый поиск с учётом многобайтовых символов напрямую. Обычно используют оператор LIKE в комбинации с функциями для работы с Юникод.

SELECT 
    SUBSTRING(column, 
              LENGTH(SUBSTRING_INDEX(LOWER(column), LOWER('мир'), -1)) + 1
             ) AS result
FROM table
WHERE column LIKE '%мир%';

Этот запрос вернёт часть строки после последнего вхождения подстроки 'мир' без учёта регистра.

PHP mb_strrichr function comments

En
Mb strrichr Finds the last occurrence of a character in a string within another, case insensitive