«А с этого места поподробнее»: как в 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