Strrchr: примеры (PHP)
strrchr(string haystack, string needle): string|falseФункция strrchr в PHP
Функция strrchr выполняет поиск последнего вхождения символа в строке. Она возвращает подстроку, начиная с этого символа и до конца исходной строки.
Функция применяется для извлечения части строки относительно последнего найденного разделителя. Распространенные сценарии включают получение расширения файла из имени или выделение домена из адреса электронной почты.
- haystack (строка) – строка, в которой ведется поиск.
- needle (строка) – искомый символ. Если передана строка, используется только ее первый символ. Начиная с PHP 8.0.0, пустая строка вызывает ValueError.
Возвращает строку или false, если символ не обнаружен.
Простые примеры strrchr
$filename = 'document.report.pdf';
$ext = strrchr($filename, '.');
echo $ext;$text = 'Пример текста';
$res = strrchr($text, 'z');
var_dump($res);bool(false)
$data = 'abc123def';
$result = strrchr($data, '23');
echo $result;3def
$path = '/home/user/data/file.txt';
$name = strrchr($path, '/');
echo $name;/file.txt
Схожие функции в PHP
Функции strstr и strchr идентичны и ищут первое вхождение подстроки, возвращая часть строки от нее. Отличие от strrchr заключается в направлении поиска.
$str = 'name.surname.example';
echo strstr($str, '.'); // первое вхождение
echo strrchr($str, '.'); // последнее вхождение.surname.example .example
Функция strrpos возвращает числовую позицию последнего вхождения символа, а не часть строки.
$str = 'test.test';
echo strrpos($str, '.');4
strrchr удобна для получения подстроки. strrpos подходит, когда нужна позиция символа. strstr применяется для поиска с начала строки.
Распространенные ошибки
В PHP 8.0.0 и выше передача пустой строки вызывает исключение.
// PHP 8
var_dump(strrchr('test', ''));ValueError: strrchr(): Argument #2 ($needle) cannot be empty
Если символ не найден, функция возвращает false. Попытка обработать это значение как строку приводит к ошибке.
$res = strrchr('Hello', 'q');
echo $res[0];Warning: Trying to access array offset on value of type bool
Функция использует только первый символ из needle. Поиск всей подстроки не выполняется.
$str = 'abcdef';
$res = strrchr($str, 'de');
echo $res; // ищется 'd'def
Изменения в PHP 8
В PHP 8.0.0 поведение функции ужесточилось. Аргумент needle не может быть пустой строкой, что вызывает ValueError. Ранее в такой ситуации возвращалось false.
// PHP 7
var_dump(strrchr('sample', ''));
// PHP 8
var_dump(strrchr('sample', ''));PHP 7: bool(false) PHP 8: ValueError (как показано выше)
Расширенные примеры применения
Получение относительного пути от последней директории.
$fullPath = '/var/www/project/src/index.php';
$relative = strrchr($fullPath, '/src/');
if ($relative !== false) {
$relative = substr($relative, 1); // убираем начальный слэш
}
echo $relative;src/index.php
Извлечение домена из адреса электронной почты.
$email = 'admin@sub.domain.com';
$domainPart = strrchr($email, '@');
if ($domainPart !== false) {
$domain = substr($domainPart, 1); // удаляем '@'
echo $domain;
}sub.domain.com
Выделение значения последнего параметра в URL-подобной строке.
$query = 'id=10&sort=desc&page=5';
$lastParam = strrchr($query, '=');
if ($lastParam !== false) {
$value = substr($lastParam, 1);
echo $value;
}5
Функция strrchr не поддерживает многобайтовые кодировки. Для корректной обработки UTF-8 строк применяют mb_strrchr.
$utf8String = 'файл.изображение.фото.jpg';
// Некорректно с strrchr
$incorrect = strrchr($utf8String, '.');
echo $incorrect; // может вывести мусор
// Корректно с mb_strrchr
if (function_exists('mb_strrchr')) {
$correct = mb_strrchr($utf8String, '.');
echo $correct;
}.jpg .jpg
Комбинация strrchr с другими функциями для сложной обработки.
$file = 'Photo2023.PNG';
$ext = strrchr($file, '.');
if ($ext !== false) {
$ext = strtolower($ext); // в нижний регистр
$ext = ltrim($ext, '.'); // удаляем точку
$ext = $ext ?: 'no extension';
echo $ext;
}png
Аналоги в других языках
Strrchr в Python
В Python похожую логику реализуют методы rpartition и rfind.
s = 'image.photo.png'
# rpartition возвращает кортеж
part = s.rpartition('.')
print(part[2]) # часть после последней точки
# через rfind
pos = s.rfind('.')
if pos != -1:
print(s[pos:])png .png
Strrchr в Javascript
В JavaScript используют метод lastIndexOf для получения позиции, затем извлекают подстроку.
let s = 'file.archive.zip';
let idx = s.lastIndexOf('.');
if (idx !== -1) {
console.log(s.slice(idx));
}.zip
Strrchr в MySQL
В MySQL функцию SUBSTRING_INDEX применяют для извлечения частей строки относительно разделителя.
SELECT SUBSTRING_INDEX('www.example.com', '.', -1) AS domain;com
SUBSTRING_INDEX возвращает текст без разделителя, в отличие от strrchr.