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); // => 12substr() всегда возвращает строку, даже если в ней только цифры. Это значит, что результат можно использовать, как обычную строку: конкатенировать, печатать, интерполировать и так далее. В том числе из него можно извлечь новую подстроку:
<?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 и выведите на экран. Задание можно сделать разными способами.
Полезное
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); // => 12substr() всегда возвращает строку, даже если в ней только цифры. Это значит, что результат можно использовать, как обычную строку: конкатенировать, печатать, интерполировать и так далее. В том числе из него можно извлечь новую подстроку:
<?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 и выведите на экран. Задание можно сделать разными способами.
Полезное
Ваше упражнение проверяется по этим тестам
<?php
namespace HexletBasics\AdvancedStrings\Slices;
use HexletBasics\Exercise\TestCase;
class SolutionTest extends TestCase
{
public function test()
{
$expected = 'hexlet.io';
$this->assertOutput($expected);
}
}Решение учителя откроется через:
20:00
