stripos()
Функция stripos() в PHP находит позицию первого вхождения подстроки в строку без учёта регистра и возвращает эту позицию.
Введение
stripos() находит позицию первого вхождения подстроки в строку без учёта регистра. Функция возвращает индекс начала совпадения (с нуля) или false, если подстрока не найдена.
Буква i в названии означает case-insensitive (без учёта регистра): "PHP", "php" и "Php" будут совпадать одинаково. Если вам нужен поиск с учётом регистра, используйте strpos(). Эта страница охватывает синтаксис, ловушку с !== false, необязательный параметр $offset и отношение stripos() к другим функциям поиска позиции.
Синтаксис
stripos(string $haystack, string $needle, int $offset = 0): int|false| Параметр | Описание |
|---|---|
$haystack | Строка, в которой выполняется поиск. |
$needle | Подстрока, которую нужно найти. |
$offset | Необязательный. Индекс в $haystack, с которого начинается поиск. По умолчанию 0 (начало строки). Отрицательное смещение отсчитывается с конца строки. |
Возвращаемое значение: позиция первого совпадения с нуля (int) или false, если $needle не найдена.
Базовый пример
Искомая строка "fox" написана в нижнем регистре, тогда как в исходной строке содержится "FOX". Поскольку stripos() игнорирует регистр, совпадение всё равно находится и выводится:
Found 'fox' at position 16Если использовать здесь strpos(), результатом будет false, так как регистры различаются.
Ловушка с !== false
Это самая распространённая ошибка при работе с stripos() (и со всеми функциями *pos()). Когда совпадение найдено в самом начале строки, возвращаемое значение равно 0 — а 0 является ложным значением в PHP. Нестрогая проверка вида if (stripos(...)) расценит реальное совпадение как «не найдено»:
<?php
$pos = stripos("Hello world", "hello");
// Wrong: 0 is falsy, so this branch runs even though there IS a match
if ($pos) {
echo "loose check: found\n";
} else {
echo "loose check: NOT found (wrong!)\n";
}
// Correct: compare against false with the strict !== operator
if ($pos !== false) {
echo "strict check: found at position $pos\n";
} else {
echo "strict check: not found\n";
}Вывод:
loose check: NOT found (wrong!)
strict check: found at position 0Всегда сравнивайте результат с !== false, если вы хотите лишь проверить, присутствует ли подстрока.
Использование параметра $offset
Третий аргумент позволяет начать поиск с середины строки — это удобно для нахождения второго (или последующего) вхождения:
<?php
$text = "PHP is great. PHP is everywhere.";
$first = stripos($text, "php"); // start at 0
$second = stripos($text, "php", $first + 1); // skip past the first match
echo "First occurrence: $first\n";
echo "Second occurrence: $second\n";Вывод:
First occurrence: 0
Second occurrence: 14Практический пример: фильтр ключевых слов без учёта регистра
Поскольку stripos() игнорирует регистр, она отлично подходит для проверок вида «содержит ли этот текст X?», например для пометки сообщений, содержащих запрещённое слово независимо от того, как оно написано:
<?php
$message = "Get this AMAZING deal now!";
$banned = ["amazing", "free", "winner"];
foreach ($banned as $word) {
if (stripos($message, $word) !== false) {
echo "Blocked: contains '$word'\n";
break;
}
}Вывод:
Blocked: contains 'amazing'Связанные функции
| Функция | Регистр | Направление поиска |
|---|---|---|
stripos() | Не учитывается | С начала → первое совпадение |
strpos() | Учитывается | С начала → первое совпадение |
strripos() | Не учитывается | С конца → последнее совпадение |
stristr() | Не учитывается | Возвращает совпавшую подстроку, а не её позицию |
Смотрите также substr() для извлечения текста по найденной позиции и str_replace() для замен с учётом регистра.
Заключение
stripos() возвращает позицию первого совпадения подстроки без учёта регистра (с нуля) или false, если совпадений нет. Не забывайте проверять результат с помощью !== false, чтобы совпадение на позиции 0 не было принято за «не найдено», используйте $offset для поиска последующих вхождений и применяйте strpos(), когда регистр имеет значение.