Mb stripos: примеры (PHP)
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
Функция выполняет поиск без учета регистра, но не поддерживает многобайтовые кодировки. Применяется для однобайтовых строк.
Аналог mb_stripos с учетом регистра символов. Используется, когда требуется чувствительность к регистру.
Проверяет наличие подстроки в строке, работает без учета регистра. Не возвращает позицию, только факт наличия.
Типичные ошибки
<?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
$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
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
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
$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); // 88
Mb stripos в MySQL
SELECT POSITION('текста' IN 'Пример текста') AS pos;8
В MySQL функция POSITION не чувствительна к регистру при использовании соответствующих collations.