Проверяем начало строки в PHP: от substr до str_starts_with

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

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

Начать курс

«А с этого места поподробнее»: как в PHP узнать, с чего начинается строка?

Каждый разработчик хотя бы раз в жизни сталкивался с задачей: «А не начинается ли эта строка с определённого слова, символа или префикса?». Казалось бы, мелочь, но от этого может зависеть логика маршрутизации, проверка URL, валидация email или разбор пользовательского ввода. В PHP, как и в любом другом языке, есть несколько способов решить эту задачу. Но какой из них правильный? А какой — самый производительный? И что делать, если у вас старая версия PHP?

В этой статье мы разберём все популярные способы проверки начала строки в PHP, начиная от классики вроде substr и strpos и заканчивая современным str_starts_with, который появился в PHP 8.0. Вы узнаете не только «как», но и «почему» стоит выбирать тот или иной метод. Поехали! 🚀

Зачем вообще проверять начало строки?

Представьте, что вы пишете парсер логов, обрабатываете URL или фильтруете файлы по расширению. Или, может быть, вам нужно отсеять все email-адреса, начинающиеся с «admin@». Или проверить, пришёл ли запрос к API с правильным префиксом. Во всех этих случаях вам нужно одно: узнать, содержит ли строка заданную подстроку в самом начале.

Казалось бы, задача тривиальная, но незнание нюансов может привести к багам, которые будет сложно отловить. Особенно если вы случайно используете strpos без проверки на false. Давайте разберём каждый метод по порядку.

Метод №1: str_starts_with (PHP 8.0+) — современный и очевидный

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

<?php
$url = "https://pythonlib.ru";
if (str_starts_with($url, "https://")) {
    echo "Строка начинается с https://";
} else {
    echo "Строка НЕ начинается с https://";
}
// Выведет: Строка начинается с https://
?>

Почему это круто?

  • ✅ Код читается как обычный английский текст: «string starts with».
  • ✅ Возвращает только true или false — никаких лишних проверок.
  • ✅ Работает с многобайтовыми кодировками (UTF-8) корректно.
  • ✅ Чувствительна к регистру. Если нужно проверить без учёта регистра — смотрите str_starts_with(strtolower(...)).

Этот метод — безусловный лидер, если у вас PHP 8.0 или выше. Но что делать, если ваш проект ещё живёт на PHP 7? Читаем дальше.

Метод №2: substr — старый друг лучше новых двух

До появления str_starts_with многие использовали substr для сравнения начала строки. Идея проста: отрезать от строки кусок нужной длины и сравнить его с искомой подстрокой.

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

if (substr($string, 0, strlen($prefix)) === $prefix) {
    echo "Строка начинается с 'Hello'";
} else {
    echo "Строка НЕ начинается с 'Hello'";
}
?>

Плюсы:

  • Работает на любой версии PHP.
  • Понятная логика.

Минусы:

  • Нужно помнить про strlen() — легко ошибиться с длиной.
  • Если строка короче префикса, substr вернёт пустую строку, и сравнение провалится (но не сломается).
  • Менее читаемо, чем современная альтернатива.

Тем не менее, это абсолютно рабочий вариант, который не подведёт. Главное — не забывайте использовать строгое сравнение ===.

Метод №3: strpos — хитрый, но опасный

Ещё один классический подход — использовать strpos(). Функция ищет первое вхождение подстроки в строке. Если подстрока найдена на позиции 0, значит, строка с неё и начинается.

<?php
$string = "PHP is awesome";
$prefix = "PHP";

// ВАЖНО: используем строгое сравнение ===
if (strpos($string, $prefix) === 0) {
    echo "Да, строка начинается с PHP";
} else {
    echo "Нет, не начинается";
}
?>

Подвох! Если не поставить === 0, а написать просто if (strpos(...)), то при совпадении вы получите 0, который в PHP приводится к false. И код не сработает! Это классическая ошибка новичков.

Ещё один нюанс: если подстрока вообще не найдена, strpos возвращает false. Сравнение false === 0 даст false, поэтому всё корректно. Но писать такой код нужно аккуратно. Рекомендуем использовать str_starts_with везде, где это возможно.

Метод №4: Регулярные выражения — когда хочется «пафоса»

Иногда разработчики используют регулярные выражения для проверки начала строки. Да, это возможно, но чаще всего — избыточно. Регулярки хороши, когда нужно проверить сложный шаблон, а не просто префикс.

<?php
$string = "https://example.com";
if (preg_match('/^https:/', $string)) {
    echo "Начинается с https:";
}
?>

Минусы:

  • Медленнее, чем str_starts_with или substr.
  • Код сложнее читать.
  • Легко ошибиться в шаблоне.

Используйте регулярки только если вам нужно, например, проверить, что строка начинается с буквы, цифры или определённого набора символов. Для простого префикса — не надо.

Сравнение производительности: кто быстрее?

Мы провели небольшой тест (на PHP 8.2) с миллионом итераций для каждого метода. Результаты:

  • str_starts_with — самый быстрый (нативная реализация на C).
  • substr + === — чуть медленнее, но в пределах погрешности для реальных проектов.
  • strpos === 0

Блоги

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