PHP: Подстроки

Работая со строками, мы часто сталкиваемся с задачей: извлечь часть строки. Например, получить год из даты, имя из полного ФИО или первые несколько символов из адреса электронной почты. Для таких случаев в PHP существует удобный инструмент: встроенная функция substr().

Что такое подстрока?

Подстрока является частью строки. То, что входит внутрь другой строки. Например, в строке '12-08-2034' подстрокой может быть '2034', '12' или даже '-'. Все зависит от того, какую информацию нам нужно извлечь.

Допустим, у нас есть строка с датой '12-08-2034'. Мы хотим получить из нее только год '2034'. В этой строке каждый символ имеет индекс (позицию), начиная с нуля:

'1' '2' '-' '0' '8' '-' '2' '0' '3' '4'
 0   1   2   3   4   5   6   7   8   9

Получается, год начинается с индекса 6 и состоит из четырех символов. Чтобы извлечь его, мы используем substr():

<?php

$value = '12-08-2034';
$year = substr($value, 6, 4);
print_r($year); // => 2034

Запись substr($value, 6, 4) означает: взять из строки $value четыре символа, начиная с индекса 6. Формат:

substr(строка, начало, длина)

Обратите внимание: третий параметр задает не индекс конца, а количество символов, которое нужно взять.

<?php

// Последний символ имеет индекс 10, а всего символов 11
$value = 'code-basics';

print_r(substr($value, 5, 6)); // => basics (6 символов с индекса 5)
print_r(substr($value, 0, 7)); // => code-ba (7 символов с начала)
print_r(substr($value, 2, 4)); // => de-b

Как все это считать? Если мы работаем с конкретной строкой, то почти всегда это делается на глаз.

Подстрока является строкой

<?php

$value = '01-12-9873';

substr($value, 1, 1); // => 1
substr($value, 3, 2); // => 12

substr() всегда возвращает строку, даже если в ней только цифры. Это значит, что результат можно использовать, как обычную строку: конкатенировать, печатать, интерполировать и так далее. В том числе из него можно извлечь новую подстроку:

<?php

$value = '01-12-9873';

$part = substr($value, 3, 4); // => 12-9
print_r(substr($part, 0, 2)); // => 12

Сначала мы получили подстроку '12-9', а потом извлекли из нее новую подстроку '12'.

Подстрока до конца или с начала

Иногда нужно взять часть строки до конца или от начала. Такие ситуации тоже легко обрабатываются:

<?php

$value = 'Hexlet';

print_r(substr($value, 3));    // => let (с индекса 3 до конца)
print_r(substr($value, 0, 3)); // => Hex (от начала, три символа)

Если длину не указать, PHP сам возьмет все символы от начального индекса до конца строки.

Отрицательные индексы

PHP позволяет считать не только слева направо, но и с конца строки. Для этого используются отрицательные значения:

<?php

$value = 'Hexlet';

print_r(substr($value, -1));    // => t (последний символ)
print_r(substr($value, -3));    // => let (последние три символа)
print_r(substr($value, 1, -1)); // => exle (с индекса 1 до предпоследнего символа)

Отрицательное начало означает отсчет от конца строки: -1 соответствует последнему символу, -2 — предпоследнему и так далее. Отрицательная длина означает «взять все, кроме указанного количества символов с конца».

Это удобно, когда заранее неизвестна длина строки, но нужно взять «хвост» или «середину» строки относительно конца.

Переворот строки

В некоторых языках, например в Python, у срезов строк есть параметр «шаг», с помощью которого можно взять каждый второй символ или перевернуть строку. У substr() шага нет, но для переворота строки в PHP есть отдельная встроенная функция strrev():

<?php

$value = 'Hexlet';

print_r(strrev($value)); // => telxeH

Подстрока с переменными

Параметры substr() не обязаны быть жестко зафиксированы числами. Можно использовать переменные:

<?php

$start = 1;
$length = 4;

$value = 'Hexlet';
print_r(substr($value, $start, $length)); // => exle

Это особенно полезно, когда границы вычисляются во время работы программы.

Осторожно: кириллица

Функция substr() работает с байтами, а не с символами. Для латиницы это одно и то же, но символы кириллицы и других нелатинских алфавитов занимают больше одного байта. Для таких строк используется функция mb_substr() — подробнее о работе с кодировками мы поговорим в конце курса.

Быстрая шпаргалка

<?php

$value = 'Hexlet';

substr($value, 0);     // Hexlet — вся строка
substr($value, 5);     // t
substr($value, 0, 5);  // Hexle
substr($value, -1);    // t — последний символ
substr($value, -3);    // let — последние три символа
substr($value, 2, -1); // xle — с третьего символа до предпоследнего
strrev($value);        // telxeH — строка в обратном порядке

Не переживайте, если сейчас не запомните все комбинации: вы быстро начнете использовать их на практике. Главное понимать, как работает базовая структура substr(строка, начало, длина).

Задание

Программа получает полный адрес сайта и должна выделить из него только имя домена — без протокола https://. В переменной $url хранится адрес https://hexlet.io. Извлеките с помощью substr() доменное имя hexlet.io и выведите на экран. Задание можно сделать разными способами.

Полезное

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются