Avatar ·

Как проверить, начинается ли строка с заданной подстроки в PHP?

Всем привет! Я новичок в PHP и пишу небольшой скрипт для обработки URL. Мне нужно проверить, начинается ли строка с определённого префикса, например, с "https://" или "/admin/". В других языках я видел функции типа startsWith(), но в PHP, похоже, такой нет. Я пробовал использовать strpos(), но он возвращает позицию, а не булево значение. Пришлось писать костыль: $url = "https://example.com"; if (strpos($url, "https://") === 0) { echo "Начинается с https"; } Это работает, но выглядит некрасиво. Приходится постоянно писать === 0, что легко забыть или перепутать с !== false. Есть ли более элегантный способ? Может, встроенная функция или короткая конструкция? Буду благодарен за примеры кода и объяснение, как это работает. Спасибо! <<>>

Лучший способ: использовать 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 (старые версии) из-за производительности.