Коротко: искать подстроку в строке в PHP удобнее всего функцией str_contains() — она возвращает true или false. Для позиции используют strpos(), без учёта регистра — stripos(), для сложных шаблонов — preg_match().
Функции поиска
| Функция | Что возвращает |
|---|---|
str_contains() |
есть или нет |
strpos() |
позицию или false |
stripos() |
позицию без учёта регистра |
strstr() |
часть строки от найденного |
preg_match() |
совпадение по шаблону |
Простая проверка
php
$text = "Ищу слово в строке";
if (str_contains($text, 'слово')) {
echo 'Найдено';
}
$pos = strpos($text, 'в'); // позиция (байты)
$has = stripos($text, 'ИЩУ') !== false; // без регистраstr_contains() читается лучше всего: результат сразу логический. strpos() даёт позицию, но важно помнить про строгое сравнение с false.
Вкладки: тонкости
php
// ошибка: 0 трактуется как «не найдено»
if (strpos($s, 'a')) { … }
// правильно
if (strpos($s, 'a') !== false) { … }Если подстрока в самом начале, strpos() вернёт 0, а это «ложное» значение. Поэтому сравнение всегда строгое — !== false.
php
mb_strpos($text, 'сло', 0, 'UTF-8');Для кириллицы позицию считают в символах через mb_strpos(), иначе получите номер байта, а не символа. Для проверки наличия используйте str_contains — она работает с байтами и подходит для UTF-8.
php
if (preg_match('/\d+/', $text)) {
echo 'Есть цифры';
}preg_match() нужен для поиска по шаблону: цифры, email, телефон, конкретный формат. Для простого текста он избыточен.
strpos() возвращает 0, если подстрока найдена в начале, и false, если не найдена. Сравнение через == или в if напрямую приведёт к неверному результату — всегда используйте !== false.Практика: найти строку
- Нужно просто наличие —
str_contains(). - Нужна позиция —
strpos()со строгим сравнением. - Регистр не важен —
stripos(). - Кириллица и позиция —
mb_strpos(). - Сложный шаблон —
preg_match(). - Проверьте результат на тестовых строках.
Частые ошибки: причина → решение
| Симптом | Причина | Решение |
|---|---|---|
| «Не найдено» в начале строки | не строгое сравнение | !== false |
| Неверная позиция кириллицы | strpos в байтах |
mb_strpos |
| Регистр мешает | использован strpos |
stripos |
| Слишком громоздко | регулярка для простого | str_contains |
| Ошибки на спецсимволах | шаблон без экранирования | экранировать preg_quote |
Проверьте себя
strpos(), если подстрока в начале?
Вопросы и ответы
Значит, подстрока не найдена. Но осторожно: 0 — тоже «ложное» значение, поэтому проверять результат нужно строго через !== false.
str_contains сразу возвращает true или false — удобно для проверки. strpos возвращает позицию, что нужно, если важно, где именно найдено.
Функцией stripos() или приведя обе строки к одному регистру. Для проверки наличия можно также сравнить результат strtolower() обеих строк.
Когда ищем не конкретный текст, а шаблон: email, телефон, дату, набор цифр. Для обычной подстроки он избыточен и медленнее.
Итоги
- Проверить наличие —
str_contains(). - Позицию даёт
strpos(), без регистра —stripos(). - Сравнивайте результат строго:
!== false. - Для кириллицы в символах используют
mb_strpos().
Комментарии
Пока комментариев нет — будьте первым, кто поделится мнением.