Strrchr: примеры (PHP)

Использование функции 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;
.pdf
Поиск отсутствующего символа
$text = 'Пример текста';
$res = strrchr($text, 'z');
var_dump($res);
bool(false)
Использование строки в needle
$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

Функции 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 применяется для поиска с начала строки.

Распространенные ошибки

Пустая строка в needle (PHP 8+)

В PHP 8.0.0 и выше передача пустой строки вызывает исключение.

// PHP 8
var_dump(strrchr('test', ''));
ValueError: strrchr(): Argument #2 ($needle) cannot be empty
Игнорирование возврата false

Если символ не найден, функция возвращает 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 (как показано выше)

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

Удаление директории из пути

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

Пример php
$fullPath = '/var/www/project/src/index.php';
$relative = strrchr($fullPath, '/src/');
if ($relative !== false) {
    $relative = substr($relative, 1); // убираем начальный слэш
}
echo $relative;
src/index.php
Обработка email

Извлечение домена из адреса электронной почты.

Пример php
$email = 'admin@sub.domain.com';
$domainPart = strrchr($email, '@');
if ($domainPart !== false) {
    $domain = substr($domainPart, 1); // удаляем '@'
    echo $domain;
}
sub.domain.com
Получение последнего параметра в строке запроса

Выделение значения последнего параметра в URL-подобной строке.

Пример php
$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.

Пример php
$utf8String = 'файл.изображение.фото.jpg';
// Некорректно с strrchr
$incorrect = strrchr($utf8String, '.');
echo $incorrect; // может вывести мусор
// Корректно с mb_strrchr
if (function_exists('mb_strrchr')) {
    $correct = mb_strrchr($utf8String, '.');
    echo $correct;
}
.jpg
.jpg
Цепочка преобразований

Комбинация strrchr с другими функциями для сложной обработки.

Пример php
$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.

PHP strrchr function comments

En
Strrchr Find the last occurrence of a character in a string