substr($string, $offset, $length) возвращает часть $string, которая начинается с позиции $offset (отсчёт с 0) и имеет длину $length символов. substr('Hello world', 0, 5) возвращает "Hello". Не указывайте $length, чтобы взять всё до конца.
substr() считает байты. Для английского текста это то же самое, что символы, но не для кириллицы, японского, китайского, эмодзи или букв с диакритикой. Для них используйте mb_substr(), она показана ниже.
Синтаксис
substr(string $string, int $offset, ?int $length = null): string
$offsetзадаёт, откуда начинать.0это первый символ. Отрицательное значение отсчитывается с конца.$lengthзадаёт, сколько байтов взять (в обычном ASCII-тексте один байт это один символ). Отрицательное значение отбрасывает столько же с конца.null(или отсутствие аргумента) означает "до конца".
Отрицательные смещение и длина: работа с конца
Отрицательный $offset начинает отсчёт с конца строки, поэтому -1 это последний символ. Отрицательная $length останавливается за столько символов до конца.
substr($s, 0, -1) это обычный способ удалить последний символ, например запятую в конце, оставленную циклом.
Первый или последний символ
Для одного байта можно обратиться к строке и по индексу. $s[0] это первый символ, а начиная с PHP 7.1 $s[-1] это последний.
Обращение к несуществующей позиции печатает предупреждение, а substr() просто возвращает пустую строку. Если строка может быть пустой, предпочитайте substr().
За пределами строки: пустая строка, а не false
Если $offset за концом строки, substr() в PHP 8 возвращает "". В PHP 7 она возвращала false, поэтому старый код с проверкой === false больше не работает.
Японский текст: используйте mb_substr
UTF-8 хранит кану и распространённые иероглифы по 3 байта (редкие иероглифы вроде 𠮷 и эмодзи занимают 4). substr() считает байты, поэтому substr('こんにちは', 0, 3) возвращает только こ, а длина, которая не попадает на границу символа, разрезает символ пополам и даёт испорченный текст. mb_substr() принимает те же аргументы и считает символы.
То же относится к эмодзи, кириллице и буквам с диакритикой вроде é. Число символов считает mb_strlen(); о байтах и символах смотрите strlen().
Сокращение текста с многоточием
Обрезка длинного заголовка для списка или карточки это самое частое реальное применение substr(). Используйте mb_substr(), чтобы японский или русский заголовок никогда не разрезался посреди символа, и добавляйте ..., только когда действительно что-то сократили.
mb_strimwidth($text, 0, $width, '...') делает то же по ширине отображения, где полноширинный японский символ считается за 2 колонки, а латинская буква за 1. Это подходит для вёрстки с фиксированной шириной.
Подсчёт подстроки через substr_count
substr_count($haystack, $needle) возвращает, сколько раз встречается $needle. Функция учитывает регистр и не считает перекрывающиеся совпадения.
substr вместе с strpos: текст до или после символа
Соедините substr() со strpos(), чтобы резать по символу, позиция которого заранее неизвестна, например по @ в адресе email:
Проверяйте, что strpos() не вернула false, прежде чем использовать её результат: если символа нет, false молча считается 0, поэтому substr('nobody', 0, $at) возвращает "", а substr('nobody', $at + 1) возвращает "obody".
Часто задаваемые вопросы
Как получить последние символы строки в PHP?
Используйте отрицательное смещение: substr($s, -3) возвращает последние 3 символа. Для текста, где могут быть японские, русские или другие многобайтовые символы, используйте mb_substr($s, -3).
Чем substr отличается от mb_substr?
substr() считает байты, а mb_substr() символы. В UTF-8 кана и распространённые иероглифы занимают по 3 байта, поэтому substr('日本語', 0, 2) разрезает символ пополам, а mb_substr('日本語', 0, 2) возвращает "日本".
Что возвращает substr, если начало за концом строки?
Пустую строку. Начиная с PHP 8.0 substr('abc', 5) возвращает ""; PHP 7 возвращал false.
Как удалить последний символ строки в PHP?
substr($s, 0, -1) возвращает всё, кроме последнего байта. Для многобайтового текста используйте mb_substr($s, 0, -1), а если нужно убрать только определённый символ в конце, rtrim($s, ',').
Как посчитать, сколько раз подстрока встречается в PHP?
substr_count($haystack, $needle): substr_count('banana', 'an') возвращает 2. Функция учитывает регистр и не считает перекрывающиеся совпадения.