Перейти к содержимому
Теория · Строки · урок 4 из 9

Функции для строк

Строку можно не только напечатать, но и разобрать на части: вырезать год из даты, заменить слово, проверить, есть ли в адресе знак @. Для этого в PHP есть готовые функции, и в этом уроке разобраны функции для длины, среза, замены и поиска.

Вернёмся к ряду плиток. Каждая плитка в строке пронумерована, и номера, как у элементов списка, начинаются с нуля. По номеру можно взять одну плитку, а функции умеют считать плитки, вырезать кусок ряда и выкладывать новый ряд.

Длина и отдельные символы

Давайте разберём дату по частям:

PHP
<?php

$date = '2026-10-23';
echo strlen($date), "\n"; // 10
echo $date[0], ' ', $date[-1], "\n"; // 2 3
echo substr($date, 0, 4), "\n"; // 2026
echo substr($date, 5, 2), "\n"; // 10
echo substr($date, -2), "\n"; // 23

Первые две строки вывода:

  • strlen($date) возвращает длину строки — число плиток: в дате их 10, вместе с дефисами;
  • $date[0] — плитка номер 0, то есть первый символ;
  • отрицательный номер считается с конца, и $date[-1] — последний символ.

Кусок строки: substr

Функция substr($s, $start, $length) вырезает кусок строки:

  • $start — номер первой плитки куска; отрицательный номер считается от конца;
  • $length — сколько плиток взять; без него кусок идёт до конца строки.

В примере три вызова:

  1. substr($date, 0, 4) берёт четыре плитки с начала — это год.
  2. substr($date, 5, 2) начинает с плитки номер 5 и берёт две — месяц.
  3. substr($date, -2) берёт последние две плитки — это день.

Новая строка вместо старой

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

PHP
$text = '  hello, world  ';
$clean = trim($text);
echo '[', $clean, ']', "\n"; // [hello, world]
echo str_replace('world', 'PHP', $clean), "\n"; // hello, PHP
echo strtoupper($clean), "\n"; // HELLO, WORLD
echo ucfirst($clean), "\n"; // Hello, world
echo str_repeat('-', 5), ' ', strrev('abc'), "\n"; // ----- cba
echo '[', $text, ']', "\n"; // [  hello, world  ]

Что делает каждая функция:

  • trim убирает пробелы и переводы строк в начале и в конце строки;
  • str_replace('world', 'PHP', $clean) заменяет каждое world на PHP: сначала что искать, потом на что менять, потом где;
  • strtoupper переводит латинские буквы в верхний регистр, strtolower — в нижний;
  • ucfirst делает заглавной только первую букву;
  • str_repeat('-', 5) повторяет строку пять раз, а strrev переворачивает её.

Последняя строка вывода показывает главное: в $text по-прежнему лежат пробелы. Функция не трогает вашу строку, а строит новую и возвращает её. Чтобы сохранить результат, его присваивают: $text = trim($text);.

Здесь игра в слова — плохая подсказка. В игре плитки переставляют прямо на столе, а функции PHP никогда не трогают ваш ряд и выкладывают рядом новый.

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

str_contains, str_starts_with и str_ends_with

Эти три функции появились в PHP 8 и отвечают на вопрос «есть ли»: возвращают true или false. str_contains ищет кусок где угодно, str_starts_with проверяет начало строки, а str_ends_with — конец. Все три различают регистр: Photo и photo для них разные строки.

strpos

strpos отвечает на другой вопрос — «где»: возвращает номер плитки, с которой начинается первое совпадение. Если совпадения нет, strpos возвращает false.

PHP
$file = 'photo.jpg';
var_dump(str_contains($file, 'Photo')); // bool(false)
var_dump(str_ends_with($file, '.jpg')); // bool(true)
var_dump(strpos($file, '.')); // int(5)
var_dump(strpos($file, 'photo')); // int(0)
var_dump(strpos($file, 'png')); // bool(false)

Точка стоит на плитке номер 5. Слово photo стоит в самом начале, поэтому его позиция — 0. Расширения png в имени нет, и strpos возвращает false.

Частая ошибка

Результат strpos проверяют прямо в if:

PHP
if (strpos($file, 'photo')) { // ✗
    echo 'found', "\n";
} else {
    echo 'not found', "\n";
}

Программа печатает not found, и PHP ничего не сообщает. Вызов strpos вернул 0, а 0, как вы уже знаете, в if считается ложью. Слово стоит в самом начале, но проверка его «не находит».

Эту ловушку любят давать на собеседованиях. До PHP 8 результат сравнивали с false явно: strpos($file, 'photo') !== false — «есть где-то», strpos($file, 'photo') === 0 — «стоит в начале». Сейчас для таких проверок берут str_contains и str_starts_with.

Главное

  • strlen даёт длину строки, $s[0] — первый символ, $s[-1] — последний.
  • substr($s, $start, $length) вырезает кусок, а отрицательное начало считается от конца.
  • Функции для строк возвращают новую строку, а переменная хранит старую, пока её не перезапишут.
  • strpos возвращает позицию или false, и позиция 0 в if ложна; на вопрос «есть ли» отвечает str_contains.