Stripos: примеры (PHP)
stripos(string haystack, string needle [, int offset]): int|falseФункция stripos в PHP
Функция stripos в PHP выполняет поиск позиции первого вхождения подстроки в строку без учета регистра символов. Она принадлежит к семейству функций для работы со строками.
Функция применяется, когда требуется найти позицию подстроки, но регистр символов не важен или неизвестен. Типичные сценарии включают проверку наличия ключевых слов в тексте, разбор пользовательского ввода или поиск тегов.
Сигнатура функции: stripos(string $haystack, string $needle, int $offset = 0): int|false.
- $haystack - строка, в которой выполняется поиск.
- $needle - искомая подстрока. Если строка пустая, функция вернет 0.
- $offset - необязательный параметр. Указывает позицию в строке, с которой начинается поиск. Отрицательное значение отсчитывается от конца строки (с PHP 7.3).
Функция возвращает целое число (позицию первого вхождения, начиная с 0) или false, если подстрока не найдена.
Примеры использования stripos
$str = "Привет, мир!";
$pos = stripos($str, "Мир");
echo $pos;8
$str = "Hello, world, hello!";
$pos = stripos($str, "hello", 5);
echo $pos;14
$str = "Searching for substring";
$pos = stripos($str, "ing", -5);
var_dump($pos);int(20)
$str = "Example string";
$result = stripos($str, "test");
var_dump($result);bool(false)
Похожие функции в PHP
Функция strpos выполняет поиск с учетом регистра. Она предпочтительна, когда важен точный регистр символов.
Функция strripos ищет последнее вхождение подстроки без учета регистра. Используется, когда нужно найти позицию последнего вхождения.
Для работы с многобайтовыми кодировками, такими как UTF-8, применяют mb_stripos. Функция учитывает особенности кодировки, в отличие от stripos, работающей только с однобайтовыми строками.
Типичные ошибки
Функция возвращает false при неудаче, но false может быть интерпретировано как 0. Это приводит к ошибкам, когда подстрока найдена в позиции 0.
$str = "Пример";
if (stripos($str, "прим")) {
echo "Найдено";
} else {
echo "Не найдено";
}Не найдено
Правильное сравнение:
if (stripos($str, "прим") !== false) {
echo "Найдено";
}При использовании отрицательного offset может возникать предупреждение, если абсолютное значение превышает длину строки.
Изменения в версиях PHP
Добавлена поддержка отрицательных значений для параметра offset. Теперь можно указывать смещение от конца строки.
Функция перестала возвращать false при пустой строке needle. Теперь возвращается 0, что согласуется с поведением strpos. Также изменен тип параметра needle: теперь принимается только строка, вызов с нестроковым аргументом вызывает TypeError.
Расширенные примеры
$text = "Она продает ракушки. Она продает ракушки у моря.";
$word = "она";
$offset = 0;
$positions = [];
while (($pos = stripos($text, $word, $offset)) !== false) {
$positions[] = $pos;
$offset = $pos + 1;
}
print_r($positions);Array
(
[0] => 0
[1] => 20
)$userAgent = $_SERVER['HTTP_USER_AGENT'];
if (stripos($userAgent, 'bot') !== false) {
echo 'Обнаружен бот';
} else {
echo 'Обычный пользователь';
}Для корректной работы с UTF-8 необходимо использовать mb_stripos.
$text = "Пример строки на русском";
$pos = mb_stripos($text, "СТРОКИ", 0, 'UTF-8');
echo $pos;8
$keywords = ['php', 'python', 'javascript'];
$text = "Изучаем язык программирования PHP";
$found = false;
foreach ($keywords as $word) {
if (stripos($text, $word) !== false) {
$found = true;
break;
}
}
var_dump($found);bool(true)
Аналоги в других языках
Stripos в Python
Метод str.find() чувствителен к регистру. Для регистронезависимого поиска строку приводят к нижнему регистру.
s = "Привет, мир!"
pos = s.lower().find("мир")
print(pos)8
Stripos в Javascript
Метод indexOf() чувствителен к регистру. Для поиска без учета регистра используют комбинацию с toLowerCase().
let str = "Hello World!";
let pos = str.toLowerCase().indexOf("world");
console.log(pos);6
Stripos в MySQL
Оператор LOCATE может использовать модификатор COLLATE для поиска без учета регистра. Более простой вариант - INSTR с приведением к нижнему регистру.
SELECT INSTR(LOWER(column_name), LOWER('search')) FROM table;