str_contains($haystack, $needle) возвращает true, если $needle встречается где-либо в $haystack, и false в остальных случаях. Функция появилась в PHP 8.0 и учитывает регистр.
В отличие от strpos(), она возвращает настоящее логическое значение, поэтому ловушки "найдено на позиции 0 выглядит как false" нет.
Синтаксис
str_contains(string $haystack, string $needle): bool
str_starts_with(string $haystack, string $needle): bool
str_ends_with(string $haystack, string $needle): bool
Все три функции появились в PHP 8.0 и работают побайтно, поэтому правильно обрабатывают кириллицу, японский и другой текст в UTF-8 без версии mb_.
Проверка начала или конца через str_starts_with и str_ends_with
Проверка без учёта регистра
str_icontains() не существует. Сначала приведите обе строки к нижнему регистру. mb_strtolower() переводит в нижний регистр и буквы за пределами ASCII, например É или кириллицу, которые strtolower() оставляет как есть.
Пустая игла возвращает true
Пустая игла находится в любой строке, в том числе в пустой. Это важно, когда игла приходит из поля поиска, которое пользователь оставил пустым.
Содержит ли строка любое или все из нескольких слов
str_contains() принимает одну иглу. Пройдите в цикле по массиву игл: для "любое" возвращайте результат при первом совпадении, для "все" при первом несовпадении.
Чтобы проверить, является ли значение одним из элементов массива, а не подстрокой строки, используйте in_array().
До PHP 8: strpos !== false
Код, который должен работать на PHP 7, использует strpos() со строгим сравнением. Ответ тот же, что у str_contains(), кроме пустой иглы: strpos() в PHP 7 печатала Warning: strpos(): Empty needle и возвращала false.
Последняя строка выводит bool(false), хотя текст там есть, потому что php стоит на позиции 0. Замена таких проверок на str_contains() одно из самых простых улучшений при переходе на PHP 8.
Часто задаваемые вопросы
Как проверить, содержит ли строка слово в PHP?
В PHP 8 используйте str_contains($haystack, $needle), она возвращает true или false: str_contains('Hello world', 'world') даёт true. В PHP 7 используйте strpos($haystack, $needle) !== false.
Учитывает ли str_contains регистр?
Да. Для проверки без учёта регистра приведите обе стороны к нижнему регистру: str_contains(mb_strtolower($haystack), mb_strtolower($needle)), или используйте stripos($haystack, $needle) !== false.
Почему str_contains возвращает true для пустой строки?
Любая строка содержит пустую строку, поэтому str_contains('abc', '') возвращает true. Если игла приходит из пользовательского ввода, сначала проверьте, что она не пустая.
Как проверить, начинается или заканчивается ли строка чем-то в PHP?
Используйте str_starts_with($s, 'http') и str_ends_with($s, '.pdf'), обе появились в PHP 8.0. Как и str_contains(), они учитывают регистр и возвращают bool.