Коротко: проверить, входит ли строка в строку в PHP, можно функциями str_contains() (PHP 8+), strpos(), strstr(), stripos() (без учёта регистра) и mb_strpos() (для UTF-8). Главная ловушка старого strpos() — позиция 0 считается «ложью», нужно сравнение с !== false.
Функции и когда их брать
| Функция | Что делает | Когда брать |
|---|---|---|
str_contains() |
возвращает true/false | PHP 8+, просто проверить вхождение |
strpos() |
позицию первого вхождения | нужна позиция или старая версия PHP |
stripos() |
позицию без учёта регистра | поиск «нестрого» |
strstr() |
часть строки от вхождения | нужно «отрезать» хвост |
mb_strpos() |
позицию для UTF-8 | русский текст |
Вкладки: примеры кода
if (str_contains($text, 'php')) {
echo 'Нашли слово php';
}Самый читаемый вариант в PHP 8 и новее. Возвращает true/false, никаких сравнений с false не нужно.
$pos = strpos($text, 'php');
if ($pos !== false) {
echo 'Вхождение найдено на позиции ' . $pos;
}if (strpos($text, 'php')) — ошибка: если подстрока в самом начале, позиция 0, а 0 — «ложь». Всегда сравнивайте с !== false.if (stripos($text, 'php') !== false) {
echo 'Найдено без учёта регистра';
}stripos игнорирует регистр: «PHP», «php» и «Php» найдутся одинаково. Возвращает позицию или false.
if (mb_strpos($text, 'привет') !== false) {
echo 'Нашли в UTF-8 строке';
}Для кириллицы важна mb_-функция: обычная считает байты, а не символы, и результат позиции будет неверным. В PHP 8 str_contains работает по байтам, для русского это допустимо при простой проверке вхождения.
str_contains(). Нужна позиция — strpos(). Без учёта регистра — stripos(). Русский текст и точная позиция — mb_strpos().Поиск нескольких вариантов
$needles = ['php', 'css', 'html'];
foreach ($needles as $needle) {
if (str_contains($text, $needle)) {
echo 'Найдено: ' . $needle;
}
}Для регулярных выражений используют preg_match() — например, поиск по шаблону (/php\d/). Но для простого вхождения регулярка избыточна и медленнее.
Частые ошибки: причина → решение
| Симптом | Причина | Решение |
|---|---|---|
| Вхождение в начале не находится | if (strpos(...)) |
сравнивать с !== false |
| Не находит русский текст | байтовая функция | mb_strpos() |
| Находит не то | регистр разный | stripos() или mb_stripos() |
Ошибка про str_contains |
старая версия PHP | обновить PHP или использовать strpos |
Проверьте себя
if (strpos($t, 'a')) — ошибка?
Вопросы и ответы
strpos возвращает позицию (число), strstr — часть строки от вхождения до конца (или до начала, если поставить true).
Переберите их циклом и вызовите проверку для каждого, либо используйте регулярное выражение с альтернативами.
Обычные функции считают байты, а русские буквы занимают по два байта в UTF-8. Позиции получаются неверными.
Когда нужен шаблон: цифры, e-mail, конкретный формат. Для простого вхождения подстроки он не нужен.
Итоги
- PHP 8 —
str_contains(); нужна позиция —strpos(). - Всегда сравнивайте
strposс!== false. - Без регистра —
stripos(), для русского —mb_strpos(). - Шаблонный поиск —
preg_match().
Комментарии
Пока комментариев нет — будьте первым, кто поделится мнением.