substr()
Функция substr() в PHP извлекает часть строки. Узнайте о синтаксисе, параметрах $offset и $length, отрицательных значениях и mb_substr().
Функция substr() возвращает фрагмент строки — символы между начальной позицией и необязательной длиной. Это один из наиболее часто используемых инструментов для работы со строками в PHP: обрезка префиксов, получение первых N символов метки, чтение поля фиксированной ширины или извлечение расширения файла — всё это сводится к вызову substr(). На этой странице рассматриваются синтаксис, все варианты поведения аргументов $start и $length (включая отрицательные значения), пограничные случаи, которые часто вызывают затруднения, и когда лучше использовать mb_substr().
Синтаксис
substr(string $string, int $offset, ?int $length = null): string| Параметр | Описание |
|---|---|
$string | Входная строка, из которой производится извлечение. |
$offset | Начальная позиция (с нуля). Отрицательное значение отсчитывается от конца строки. |
$length | Необязательный. Количество возвращаемых символов. Если опустить (или передать null), будет возвращено всё до конца строки. Отрицательное значение означает «остановиться на столько символов раньше конца». |
substr() возвращает извлечённую подстроку. Начиная с PHP 8.0 функция всегда возвращает string (пустую строку, если ничего не совпало); до PHP 8.0 при ошибке возвращалось false, поэтому в старом коде это ещё можно встретить.
Базовый пример
$offset равен 0, поэтому извлечение начинается с первого символа, а $length равен 5, поэтому возвращаются пять символов (Hello). Помните, что смещение с нуля: позиция 0 — это H, позиция 1 — это e, и так далее.
Как работает смещение
Положительное смещение отсчитывается от начала строки; отрицательное — от конца (где -1 — это последний символ):
<?php
$string = "Hello World!";
echo substr($string, 6); // World! — from offset 6 to the end
echo "\n";
echo substr($string, -6); // World! — last 6 characters
echo "\n";
echo substr($string, -1); // ! — just the last characterЕсли $length опустить, возвращается всё начиная с указанного смещения — удобно для удаления известного префикса.
Как работает длина
Положительное значение $length ограничивает количество возвращаемых символов. Отрицательное значение $length останавливает извлечение за столько символов до конца строки, что удобно для обрезки известного суффикса:
<?php
$string = "Hello World!";
echo substr($string, 0, -1); // Hello World — drop the trailing "!"
echo "\n";
echo substr($string, -6, 5); // World — start 6 from the end, take 5
echo "\n";
echo substr($string, 4, 0); // (empty) — length 0 returns ""Если запрошенная длина выходит за пределы строки, substr() просто вернёт всё, что есть — ошибки из-за «слишком большой» длины не возникает.
Практический пример: расширение файла
Сочетание substr() и strrpos() (которая находит последнюю позицию символа) — классический способ получить расширение файла:
<?php
$filename = "report.final.pdf";
$ext = substr($filename, strrpos($filename, ".") + 1);
echo $ext; // pdfРаспространённые ошибки
- Смещение за пределами строки. Если
$offsetбольше длины строки, возвращается пустая строка (в PHP 8+). Перехода по кругу не происходит. - Считает байты, а не символы.
substr()работает с байтами. Для текста в UTF-8 с акцентированными буквами или эмодзи разрезание посередине символа приведёт к «мусору». Используйтеmb_substr()для многобайтово-безопасного извлечения. - Ошибка на единицу с длиной.
$length— это счётчик, а не конечный индекс.substr($s, 2, 3)вернёт 3 символа, начиная с индекса 2, а не символы между индексами 2 и 3.
Связанные функции
strlen()— получить длину строки, часто используется для вычисления$length.strpos()— найти начало подстроки, чтобы передать значение вsubstr().explode()— разбить строку на массив при наличии разделителя.trim()— удалить пробелы (или другие символы) с обоих концов.