PHP string contains: как проверить подстроку
Для проверки, содержит ли строка в PHP подстроку, используйте str_contains(): функция проверяет вхождение одной строки в другую и возвращает boolean. Она подходит для защитных условий, проверок маршрутизации и валидации ввода, где нужен только ответ да/нет. По сравнению с strpos() этот подход избегает ловушки, когда 0 интерпретируется как false, и читается чище без !== false. str_contains() доступна в PHP 8.0+.
Пример PHP String Contains для проверки подстроки
Вывод:
Результат появится здесь...
Вывод:
Статус: отправлен
Как работает этот пример
$messageхранит обычную строку с описанием статуса.str_contains($message, "отправлен")проверяет строку-источник на точное вхождение подстроки"отправлен"и возвращаетtrue, потому что подстрока присутствует.- Блок
ifвыполняется, потому что функция уже возвращает boolean, и дополнительное сравнение с приведением типов не требуется.
Что такое str_contains в PHP?
str_contains(string $haystack, string $needle): bool — функция PHP 8.0 для регистрозависимой и binary-safe проверки наличия подстроки. Она возвращает true, когда $needle найден где угодно внутри $haystack, и false в остальных случаях. Пустой $needle всегда возвращает true — это поведение определено спецификацией PHP, а не баг.
Частые ошибки с str_contains()
Ожидать поиск без учета регистра
Неправильно:
str_contains("Hello World", "hello"); // false
Правильно:
stripos("Hello World", "hello") !== false; // true
str_contains() чувствительна к регистру. Для поиска без учета регистра используйте stripos() !== false (или нормализуйте обе строки перед вызовом str_contains()).
Использовать strpos() как boolean (ошибка при миграции)
Неправильно:
if (strpos("отправлен", "отпр")) echo "совпадение"; // нет вывода (0 считается false)
Правильно:
if (strpos("отправлен", "отпр") !== false) echo "совпадение";
В PHP 8+ выбирайте str_contains(), когда нужен только boolean.
str_contains vs strpos vs stripos
| Функция | Возвращает | Регистр | Версия PHP |
|---|---|---|---|
str_contains() | bool | Учитывается | 8.0+ |
strpos() | int|false | Учитывается | 4+ |
stripos() | int|false | Не учитывается | 5+ |
Используйте str_contains(), когда в PHP 8+ нужна только проверка true/false. Используйте strpos(), когда нужна позиция совпадения или поддержка PHP 7.x. Используйте stripos(), когда нужна проверка без учета регистра и позиция совпадения (она возвращает индекс, как strpos()).
FAQ
Чувствительна ли str_contains к регистру?
Да. str_contains("PHP", "php") возвращает false. Для проверок без учета регистра либо приведите оба аргумента к нижнему регистру через strtolower() перед вызовом str_contains(), либо используйте stripos($haystack, $needle) !== false.
Почему str_contains возвращает true для пустой строки?
По определению пустая строка является подстрокой любой строки. Это соответствует поведению strpos("anything", ""), которая в PHP 8 возвращает 0. Проверяйте пользовательский ввод на пустое значение до вызова str_contains(), если это может сломать бизнес-логику.
Как проверить наличие подстроки в PHP 7?
Используйте strpos($haystack, $needle) !== false. Строгое сравнение !== false критично, потому что strpos() возвращает 0, когда подстрока стоит в начале, а 0 в PHP считается ложным значением. Эта ловушка — главная причина появления str_contains().