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

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

Функция mb_strrchr

Описание

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

Когда используется

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

Аргументы
  • haystack (string) – Исходная строка, в которой выполняется поиск.
  • needle (string) – Символ или подстрока для поиска. Если передана строка, используется только первый символ.
  • before_needle (bool) – Если true, функция возвращает часть строки до последнего вхождения needle. По умолчанию false.
  • encoding (string|null) – Кодировка строки. Если не указана, используется внутренняя кодировка.

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

Базовый поиск

Поиск последней точки в строке файла.

<?php
$path = 'документ.статья.текст.txt';
echo mb_strrchr($path, '.');
?>
.txt
С параметром before_needle

Получение части строки до последней точки.

<?php
$path = 'документ.статья.текст.txt';
echo mb_strrchr($path, '.', true);
?>
документ.статья.текст
Поиск многобайтового символа

Работа с символом юникода.

<?php
$text = 'Пример⭐текст⭐с⭐эмодзи';
echo mb_strrchr($text, '⭐');
?>
⭐эмодзи
Явное указание кодировки
<?php
$text = 'Привет, мир!';
echo mb_strrchr($text, 'и', false, 'UTF-8');
?>
ир!

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

  • strrchr — байтовая версия, не поддерживает многобайтовые кодировки. Быстрее для однобайтовых строк.
  • mb_strrichr — многобайтовый поиск последнего вхождения без учета регистра.
  • mb_strstr — ищет первое вхождение символа в строке.
  • strrpos — возвращает позицию последнего вхождения, а не часть строки.
  • explode с end — альтернатива для извлечения последней части строки по разделителю.

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

Типичные ошибки

Игнорирование многобайтовой природы строк

Использование strrchr вместо mb_strrchr для UTF-8.

<?php
$text = 'пример★текст';
echo strrchr($text, '★'); // Может вернуть некорректный результат
?>
�екст
Неверная кодировка

Указание неверной кодировки приводит к некорректному результату.

<?php
$text = 'Привет';
echo mb_strrchr($text, 'и', false, 'ISO-8859-1');
?>
���ет
Передача пустой строки в needle
<?php
$text = 'Пример';
echo mb_strrchr($text, '');
?>
Warning: mb_strrchr(): Empty delimiter

Изменения в версиях PHP

  • PHP 8.0: параметр needle теперь принимает только строку. Передача числа или другого типа вызывает ошибку TypeError. Ранее число преобразовывалось в символ.
  • PHP 7.1: добавлена поддержка отрицательных значений для параметра length (в других функциях, например mb_strstr). Для mb_strrchr это изменение не затронуло.

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

Обработка пути с несколькими расширениями
Пример php
<?php
$file = 'archive.tar.gz';
$extension = mb_strrchr($file, '.');
echo 'Расширение: ' . $extension;
?>
Расширение: .gz
Извлечение домена верхнего уровня из URL
Пример php
<?php
$url = 'https://subdomain.example.co.uk/page';
$domain = mb_strrchr(parse_url($url, PHP_URL_HOST), '.', true);
echo 'Домен: ' . $domain;
?>
Домен: co.uk
Поиск с использованием подстроки

При передаче строки в needle используется только ее первый символ.

Пример php
<?php
$text = 'abcabcabc';
echo mb_strrchr($text, 'bc'); // Ищет символ 'b'
?>
bc
Обработка текста с переносами строк
Пример php
<?php
$text = "Первая строка\nВторая строка\nТретья строка";
$lastLine = mb_strrchr($text, "\n", true);
echo 'Последняя строка: ' . $lastLine;
?>
Последняя строка: Третья строка
Комбинирование с другими функциями

Получение имени файла без расширения, когда расширение может отсутствовать.

Пример php
<?php
function getFileNameWithoutExt($path) {
    $base = basename($path);
    $pos = mb_strrchr($base, '.', true);
    return $pos !== false ? $pos : $base;
}

echo getFileNameWithoutExt('file.txt'); // file
echo getFileNameWithoutExt('document'); // document
?>
file
document

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

Mb strrchr в Python

Метод str.rpartition или комбинация str.rfind и среза.

text = 'документ.статья.текст.txt'
# Способ 1
result = text.rpartition('.')
print(result[2])  # txt
# Способ 2
idx = text.rfind('.')
print(text[idx:] if idx != -1 else '')  # .txt
txt
.txt

Mb strrchr в Javascript

Метод lastIndexOf со срезом строки.

let text = 'документ.статья.текст.txt';
let idx = text.lastIndexOf('.');
let result = idx !== -1 ? text.substring(idx) : '';
console.log(result); // .txt
.txt

Mb strrchr в MySQL

Функция SUBSTRING_INDEX для получения части строки относительно разделителя.

SELECT SUBSTRING_INDEX('документ.статья.текст.txt', '.', -1);
txt

Отличия от PHP: в Python и JavaScript нет прямой аналогичной функции, требуется использовать комбинацию методов. В MySQL функция работает с разделителями, а не с одиночными символами.

PHP mb_strrchr function comments

En
Mb strrchr Find the last occurrence of a character in a string