W3docs

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, поэтому в старом коде это ещё можно встретить.

Базовый пример

php— editable, runs on the server

$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() — удалить пробелы (или другие символы) с обоих концов.

Практика

Практика
Для чего используется функция substr() в PHP?
Для чего используется функция substr() в PHP?
Was this page helpful?