1

Stripos: примеры (PHP)

Функция 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
С использованием offset
$str = "Hello, world, hello!";
$pos = stripos($str, "hello", 5);
echo $pos;
14
Отрицательный offset
$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 ищет последнее вхождение подстроки без учета регистра. Используется, когда нужно найти позицию последнего вхождения.

stripos vs mb_stripos

Для работы с многобайтовыми кодировками, такими как UTF-8, применяют mb_stripos. Функция учитывает особенности кодировки, в отличие от stripos, работающей только с однобайтовыми строками.

Типичные ошибки

Сравнение результата без учета типа

Функция возвращает false при неудаче, но false может быть интерпретировано как 0. Это приводит к ошибкам, когда подстрока найдена в позиции 0.

$str = "Пример";
if (stripos($str, "прим")) {
    echo "Найдено";
} else {
    echo "Не найдено";
}
Не найдено

Правильное сравнение:

if (stripos($str, "прим") !== false) {
    echo "Найдено";
}
Некорректная обработка offset

При использовании отрицательного offset может возникать предупреждение, если абсолютное значение превышает длину строки.

Изменения в версиях PHP

PHP 7.3

Добавлена поддержка отрицательных значений для параметра offset. Теперь можно указывать смещение от конца строки.

PHP 8.0

Функция перестала возвращать false при пустой строке needle. Теперь возвращается 0, что согласуется с поведением strpos. Также изменен тип параметра needle: теперь принимается только строка, вызов с нестроковым аргументом вызывает TypeError.

Расширенные примеры

Поиск всех вхождений подстроки
Пример php
$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
)
Использование в условных конструкциях
Пример php
$userAgent = $_SERVER['HTTP_USER_AGENT'];
if (stripos($userAgent, 'bot') !== false) {
    echo 'Обнаружен бот';
} else {
    echo 'Обычный пользователь';
}
Работа с кириллицей и UTF-8

Для корректной работы с UTF-8 необходимо использовать mb_stripos.

Пример php
$text = "Пример строки на русском";
$pos = mb_stripos($text, "СТРОКИ", 0, 'UTF-8');
echo $pos;
8
Проверка наличия одного из нескольких слов
Пример php
$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;

PHP stripos function comments

En
Stripos Find the position of the first occurrence of a case-insensitive substring in a string