Mb stripos: примеры (PHP)

Функция mb_stripos для поиска в многобайтовых строках
Раздел: Многобайтовые строки
mb_stripos(string $haystack, string $needle, int $offset = 0, ?string $encoding = null): int|false

Функция mb_stripos в PHP

Функция mb_stripos выполняет поиск подстроки в строке без учета регистра символов. Эта функция предназначена для корректной обработки многобайтовых строк, например, в кодировках UTF-8.

Использование функции актуально при работе с текстами на языках с многобайтовыми символами (японский, китайский, арабский и другие), когда стандартные функции PHP, такие как stripos, могут давать некорректные результаты.

Аргументы функции
  • haystack (обязательный) — строка, в которой выполняется поиск.
  • needle (обязательный) — подстрока для поиска.
  • offset (необязательный) — позиция начала поиска в байтах. Если отрицательный, отсчитывается от конца строки.
  • encoding (необязательный) — кодировка строк. Если не указана, используется внутренняя кодировка.

Примеры использования mb_stripos

Базовый поиск
<?php
$text = 'Привет, мир!';
$pos = mb_stripos($text, 'МИР');
echo $pos; // 8
?>
8
Поиск с указанием смещения
<?php
$text = 'Яблоко, яблоко, апельсин';
$pos = mb_stripos($text, 'яблоко', 7);
echo $pos; // 9
?>
9
Поиск с указанием кодировки
<?php
$text = 'Пример текста';
$pos = mb_stripos($text, 'ТЕКСТА', 0, 'UTF-8');
echo $pos; // 8
?>
8

Похожие функции в PHP

stripos

Функция выполняет поиск без учета регистра, но не поддерживает многобайтовые кодировки. Применяется для однобайтовых строк.

Аналог mb_stripos с учетом регистра символов. Используется, когда требуется чувствительность к регистру.

str_contains (PHP 8)

Проверяет наличие подстроки в строке, работает без учета регистра. Не возвращает позицию, только факт наличия.

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

Некорректная кодировка
<?php
$text = 'Тест';
$pos = mb_stripos($text, 'т', 0, 'ASCII');
var_dump($pos); // bool(false)
?>
bool(false)
Поиск пустой строки
<?php
$text = 'Тест';
$pos = mb_stripos($text, '');
var_dump($pos); // bool(false)
?>
bool(false)
Отрицательное смещение без поддержки PHP
<?php
$text = 'Пример';
$pos = mb_stripos($text, 'п', -3); // Предупреждение
?>
Warning: mb_stripos(): Offset not contained in string

Изменения в последних версиях PHP

В PHP 8.0 функция mb stripos теперь выбрасывает исключение TypeError при передаче неверных типов аргументов. Ранее возвращалось false.

В PHP 8.2 добавлена поддержка отрицательных значений offset для подсчета с конца строки.

<?php
// PHP 8.2+
$text = 'Пример текста';
$pos = mb_stripos($text, 'пример', -5);
echo $pos; // 0
?>
0

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

Поиск всех вхождений подстроки
Пример php
<?php
function findAllPositions($haystack, $needle) {
    $positions = [];
    $offset = 0;
    while (($pos = mb_stripos($haystack, $needle, $offset)) !== false) {
        $positions[] = $pos;
        $offset = $pos + mb_strlen($needle);
    }
    return $positions;
}

$text = 'Один, два, один, три';
$result = findAllPositions($text, 'один');
print_r($result);
?>
Array
(
    [0] => 0
    [1] => 11
)
Поиск в массиве строк
Пример php
<?php
function searchInArray($array, $needle) {
    $results = [];
    foreach ($array as $index => $string) {
        if (mb_stripos($string, $needle) !== false) {
            $results[] = $index;
        }
    }
    return $results;
}

$data = ['Яблоко', 'Апельсин', 'банан'];
$found = searchInArray($data, 'АПЕЛЬСИН');
print_r($found);
?>
Array
(
    [0] => 1
)
Проверка с несколькими кодировками
Пример php
<?php
$textUtf8 = mb_convert_encoding('Пример', 'UTF-8');
$textWin1251 = mb_convert_encoding('Пример', 'Windows-1251');

$pos1 = mb_stripos($textUtf8, 'пример', 0, 'UTF-8');
$pos2 = mb_stripos($textWin1251, 'пример', 0, 'Windows-1251');

echo "UTF-8: $pos1, Windows-1251: $pos2";
?>
UTF-8: 0, Windows-1251: 0

Аналоги функции в других языках

Mb stripos в Python

text = 'Пример текста'
try:
    pos = text.lower().index('текста'.lower())
    print(pos)
except ValueError:
    print('Не найдено')
8

Mb stripos в Javascript

let text = 'Пример текста';
let pos = text.toLowerCase().indexOf('текста'.toLowerCase());
console.log(pos); // 8
8

Mb stripos в MySQL

SELECT POSITION('текста' IN 'Пример текста') AS pos;
8

В MySQL функция POSITION не чувствительна к регистру при использовании соответствующих collations.

PHP mb_stripos function comments

En
Mb stripos Performs a case-insensitive multi-byte string search for the first occurrence of a string within another