Mb strrchr: примеры (PHP)
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
Получение части строки до последней точки.
<?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');
?>���ет
<?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
$file = 'archive.tar.gz';
$extension = mb_strrchr($file, '.');
echo 'Расширение: ' . $extension;
?>Расширение: .gz
<?php
$url = 'https://subdomain.example.co.uk/page';
$domain = mb_strrchr(parse_url($url, PHP_URL_HOST), '.', true);
echo 'Домен: ' . $domain;
?>Домен: co.uk
При передаче строки в needle используется только ее первый символ.
<?php
$text = 'abcabcabc';
echo mb_strrchr($text, 'bc'); // Ищет символ 'b'
?>bc
<?php
$text = "Первая строка\nВторая строка\nТретья строка";
$lastLine = mb_strrchr($text, "\n", true);
echo 'Последняя строка: ' . $lastLine;
?>Последняя строка: Третья строка
Получение имени файла без расширения, когда расширение может отсутствовать.
<?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 '') # .txttxt .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 функция работает с разделителями, а не с одиночными символами.