PHP string contains: как проверить подстроку

Для проверки, содержит ли строка в PHP подстроку, используйте str_contains(): функция проверяет вхождение одной строки в другую и возвращает boolean. Она подходит для защитных условий, проверок маршрутизации и валидации ввода, где нужен только ответ да/нет. По сравнению с strpos() этот подход избегает ловушки, когда 0 интерпретируется как false, и читается чище без !== false. str_contains() доступна в PHP 8.0+.

Пример PHP String Contains для проверки подстроки

Вывод:

Результат появится здесь...

Вывод:

Статус: отправлен

Как работает этот пример

  1. $message хранит обычную строку с описанием статуса.
  2. str_contains($message, "отправлен") проверяет строку-источник на точное вхождение подстроки "отправлен" и возвращает true, потому что подстрока присутствует.
  3. Блок 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().