«А начинается ли моя строка с этого слова?» — вечный вопрос 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()
|