Menu

PHP substr(): получить часть строки

substr($string, $offset, $length) возвращает часть строки. Отрицательные смещения, первые и последние символы, mb_substr для кириллицы, японского и другого текста в UTF-8, substr_count и обрезка текста с многоточием.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

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. Функция учитывает регистр и не считает перекрывающиеся совпадения.

Иллюстрация языков программирования Coddy

Учитесь программировать с Coddy

НАЧАТЬ