Mb strrichr: примеры (PHP)
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 заключается в поиске первого, а не последнего совпадения.
Возвращает позицию последнего вхождения подстроки без учёта регистра, но для однобайтовых строк. Для многобайтовых строк рекомендуется использовать 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 возникает фатальная ошибка.
Fatal error: Uncaught Error: Call to undefined function mb_strrichr()Изменения в последних версиях PHP
В PHP 8.0 функция mb_strrichr стала более строгой к типам передаваемых аргументов. Передача аргументов несовместимых типов теперь вызывает ошибку TypeError. В предыдущих версиях PHP такие аргументы могли неявно преобразовываться.
В PHP 8.2 не было внесено значительных изменений в работу этой функции. Однако рекомендуется всегда указывать кодировку явно для избежания неоднозначностей.
Расширенные примеры использования
<?
$filename = 'Документ.ТХТ';
// Ищем последнюю точку и возвращаем расширение
$extension = mb_strrichr($filename, '.', false, 'UTF-8');
if ($extension !== false) {
echo 'Расширение файла: ' . $extension;
}
?>Расширение файла: .ТХТ
<?
$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
<?
$text = "Первая строка\nВторая СТРОКА\nтретья строка";
// Поиск последнего вхождения 'строка' без учёта регистра
$result = mb_strrichr($text, 'СТРОКА', false, 'UTF-8');
echo $result;
?>строка
<?
$text = 'café café';
// Поиск последнего вхождения 'cafe' без учёта акцентов
$result = mb_strrichr($text, 'cafe', false, 'UTF-8');
echo $result;
?>café
Аналоги функции в других языках
В 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 '%мир%';Этот запрос вернёт часть строки после последнего вхождения подстроки 'мир' без учёта регистра.