Как проверить, начинается ли строка с заданной подстроки в PHP?
Лучший способ: использовать str_starts_with() (PHP 8.0+)
Начиная с PHP 8.0, в языке появилась встроенная функция str_starts_with(), которая делает именно то, что вам нужно. Она возвращает true, если строка начинается с заданной подстроки, и false в противном случае.
<?php
$url = "https://example.com";
if (str_starts_with($url, "https://")) {
echo "Начинается с https";
} else {
echo "Не начинается с https";
}
// Вывод: Начинается с https
?>
Функция работает с обычными строками и поддерживает мультибайтовые кодировки (например, UTF-8) без дополнительных настроек. Она чувствительна к регистру, поэтому "https" и "HTTPS" будут разными.
Пример с проверкой нескольких префиксов:
<?php
$path = "/admin/dashboard";
if (str_starts_with($path, "/admin")) {
echo "Это админка";
} elseif (str_starts_with($path, "/user")) {
echo "Это пользовательский раздел";
} else {
echo "Другая страница";
}
// Вывод: Это админка
?>
Для старых версий PHP (7.x и ниже): функция strpos() с === 0
Если вы работаете на PHP 7 или ниже, ваш подход с strpos() — это правильный и самый быстрый способ. Ключевой момент — строгое сравнение === 0, а не == 0, чтобы отличить позицию 0 (найдено в начале) от false (не найдено).
<?php
$string = "Hello, world!";
$prefix = "Hello";
if (strpos($string, $prefix) === 0) {
echo "Строка начинается с 'Hello'";
}
?>
Почему это работает: strpos() возвращает целое число (позицию первого вхождения) или false, если подстрока не найдена. Если подстрока находится в самом начале, позиция равна 0. Сравнение === 0 проверяет, что результат — именно целое число 0, а не false (потому что false == 0 в PHP, но false === 0 — нет).
Собственная функция для удобства (любая версия PHP)
Если вы часто используете эту проверку и хотите писать чистый код, создайте свою функцию-обёртку:
<?php
function startsWith($string, $prefix) {
return strpos($string, $prefix) === 0;
}
// Использование:
if (startsWith($url, "https://")) {
echo "Безопасное соединение";
}
?>
Для мультибайтовых строк (кириллица, иероглифы) используйте mb_strpos():
<?php
function mb_startsWith($string, $prefix) {
return mb_strpos($string, $prefix) === 0;
}
$text = "Привет, мир!";
if (mb_startsWith($text, "Привет")) {
echo "Начинается с 'Привет'";
}
?>
Сравнение методов
- str_starts_with() — самый читаемый, но требует PHP 8.0+
- strpos() === 0 — быстрый и совместимый, но менее очевидный
- preg_match() — избыточен для простой проверки, используйте только если нужны регулярные выражения
- substr() — можно вырезать первый N символов и сравнить, но это менее эффективно
Рекомендация: Если у вас PHP 8+, используйте str_starts_with(). Для проектов на старых версиях — создайте свою функцию с strpos() и === 0. Это сделает код понятным и избежит ошибок.
Альтернативный подход: substr() для наглядности
Если вам не нравится синтаксис strpos() === 0, можно использовать substr() для сравнения первых символов:
<?php
$string = "Hello, world!";
$prefix = "Hello";
if (substr($string, 0, strlen($prefix)) === $prefix) {
echo "Строка начинается с 'Hello'";
}
?>
Этот метод явно показывает, что мы берём первые N символов (где N — длина префикса) и сравниваем их. Он менее эффективен, чем strpos(), но более читаем для новичков.
Важно: Для мультибайтовых строк используйте mb_substr():
<?php
$text = "Привет, мир!";
$prefix = "Привет";
if (mb_substr($text, 0, mb_strlen($prefix)) === $prefix) {
echo "Начинается с 'Привет'";
}
?>
Этот подход хорош, когда вы пишете учебный код или хотите максимально явно показать логику. Для production-кода всё же лучше использовать str_starts_with() (PHP 8+) или strpos() === 0 (старые версии) из-за производительности.
Ответов пока нет.
Войдите чтобы оставить ответ