Проверяем начало строки в PHP: все способы и подводные камни

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

«А начинается ли моя строка с этого слова?» — вечный вопрос PHP-разработчика

Представьте ситуацию: вы пишете парсер URL, обрабатываете входящие запросы или просто фильтруете список файлов. И тут встаёт задача — нужно проверить, начинается ли строка с определённого набора символов. Казалось бы, что может быть проще? Но не тут-то было. До недавнего времени в PHP не было встроенной функции для этой простейшей операции. Разработчики изощрялись кто во что горазд: кто-то резал строку через substr(), кто-то искал позицию через strpos(), а кто-то вообще лез в дебри регулярных выражений.

В этой статье мы разложим по полочкам все способы проверки начала строки в PHP. Вы узнаете не только как это сделать «по красоте» в современных версиях, но и как решать задачу на «легаси» проектах, где PHP 5 ещё в ходу. Поехали!

Самый правильный способ: str_starts_with() (PHP 8.0+)

Если ваш проект работает на PHP 8.0 или новее — вы счастливчик. Вам доступна нативная функция str_starts_with(), которая делает ровно то, что написано на коробке. Она принимает два аргумента: исходную строку и подстроку, которую мы ищем в начале. Возвращает true или false.

<?php
$url = "https://pythonlib.ru/php-tutorial";

if (str_starts_with($url, "https://")) {
    echo "Ссылка безопасная, используем HTTPS";
} else {
    echo "Внимание! Не HTTPS соединение";
}
// Выведет: Ссылка безопасная, используем HTTPS
?>

Почему это лучший вариант?

  • Читаемость — код говорит сам за себя. Вам не нужно комментировать, что делает эта строка.
  • Производительность — функция оптимизирована на уровне C-кода PHP. Она работает быстрее, чем ручные проверки.
  • Безопасность — никаких проблем с многобайтовыми кодировками (если вы не работаете с UTF-8 особым образом, но об этом позже).

Кстати, у функции есть «сестра-близнец» — str_ends_with(), которая проверяет окончание строки. Но это уже тема для отдельной статьи.

Классика жанра: strpos()

До появления str_starts_with() самым популярным способом было использование функции strpos(). Она ищет первое вхождение подстроки в строке и возвращает его позицию (число). Если подстрока не найдена — возвращает false.

Хитрость в том, что если подстрока находится в самом начале, её позиция будет равна 0. А 0 в PHP — это falsy значение. Поэтому проверка должна быть строгой:

<?php
$string = "Hello, world!";

if (strpos($string, "Hello") === 0) {
    echo "Строка начинается с Hello";
} else {
    echo "Нет, начало другое";
}
?>

Важно! Всегда используйте оператор строгого сравнения ===, а не ==. Почему? Представьте, что вы ищете подстроку, которой нет. strpos() вернёт false. Если написать strpos($string, "test") == 0, то false == 0 даст true (потому что PHP приводит типы). И ваш код скажет, что строка начинается с "test", хотя это не так. Классическая ловушка для новичков!

Плюсы и минусы strpos()

  • ✅ Работает на всех версиях PHP, начиная с 4.
  • ✅ Не требует установки расширений.
  • ❌ Код менее читаемый — нужно помнить про строгое сравнение.
  • ❌ При неправильном использовании (без ===) даёт трудноуловимые баги.

Дедушкин метод: substr()

Ещё один способ, который пришёл к нам из глубин истории. Идея простая: вырезать из строки кусок такой же длины, как искомая подстрока, и сравнить их.

<?php
$filename = "report_2024.pdf";

$prefix = "report_";
if (substr($filename, 0, strlen($prefix)) === $prefix) {
    echo "Это отчёт за 2024 год";
}
?>

Этот метод нагляден, но у него есть недостатки:

  • Лишняя операция — мы сначала вырезаем подстроку, потом сравниваем. Это чуть медленнее, чем strpos().
  • Риск ошибки с длиной — если искомая подстрока длиннее самой строки, substr() вернёт false, и сравнение сломается. Хотя на практике такое бывает редко.

Тяжёлая артиллерия: регулярные выражения

Если вы любите всё усложнять (или вам нужно проверить не просто точное совпадение, а по шаблону), на помощь приходят регулярные выражения. Символ ^ в регулярке означает начало строки.

<?php
$email = "user@example.com";

if (preg_match("/^user/", $email)) {
    echo "Email начинается с 'user'";
}

// Проверка с регистронезависимостью
if (preg_match("/^USER/i", $email)) {
    echo "И это тоже сработает, потому что мы включили флаг i";
}
?>

Когда это оправдано?

  • Когда нужно проверить не просто точное начало, а шаблон: например, строка должна начинаться с цифры, или с буквы в любом регистре.
  • Когда вы уже используете регулярки для других проверок в этом же блоке кода.

Но для простой проверки начала строки это избыточно и медленно. Регулярные выражения — мощный инструмент, но не стоит забивать микро-гвозди кувалдой.

Что выбрать для реального проекта?

Давайте составим простую шпаргалку:

Версия PHP Рекомендуемый способ
PHP 8.0 и новее str_starts_with() — однозначно
PHP 7.x / 5.x strpos() === 0 — самый надёжный
Любая версия (если нужен шаблон) preg_match()

Блоги

Рекомендаций по книгам