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

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

Функция mb_stristr выполняет поиск первого вхождения подстроки в строке без учета регистра с поддержкой многобайтовых кодировок. Она применяется при работе с текстами на языках, использующих многобайтовые символы, таких как кириллица, иероглифы и другие. Это позволяет корректно обрабатывать строки в кодировках UTF-8, Windows-1251 и других.

Аргументы функции

Функция принимает до четырех параметров:

  • haystack (обязательный) - строка, в которой выполняется поиск.
  • needle (обязательный) - подстрока для поиска.
  • before_needle (необязательный) - логический параметр. Если установлен в true, возвращает часть строки до первого вхождения подстроки. По умолчанию false.
  • encoding (необязательный) - кодировка строки. Если не указана, используется внутренняя кодировка или кодировка, установленная функцией mb_internal_encoding().

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

Базовый пример
$str = 'Привет, мир!';
$search = 'МИР';
$result = mb_stristr($str, $search);
echo $result;
мир!
Использование before_needle
$str = 'Пример текста';
$search = 'текста';
$result = mb_stristr($str, $search, true);
echo $result;
Пример 
С указанием кодировки
$str = 'Строка в кодировке UTF-8';
$search = 'UTF';
$result = mb_stristr($str, $search, false, 'UTF-8');
echo $result;
UTF-8

Альтернативные функции в PHP

Для работы с многобайтовыми строками существует несколько функций:

  • mb_strpos - возвращает позицию первого вхождения подстроки без учета регистра. Используется, когда нужна позиция, а не часть строки.
  • mb_stripos - аналог mb_strpos, но без учета регистра.
  • stristr - однобайтовый аналог, работает только с ASCII. Применяется для английского текста.
  • mb_strstr - многобайтовый аналог с учетом регистра.

Выбор функции зависит от необходимости учета регистра и работы с многобайтовыми строками.

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

Использование неправильной кодировки
$str = 'Текст';
$search = 'текст';
$result = mb_stristr($str, $search, false, 'ASCII');
var_dump($result);
bool(false)
Передача нестроковых значений
$result = mb_stristr(12345, '3');
var_dump($result);
string(3) "345"

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

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

В PHP 8 функция mb stristr стала более строгой к типам передаваемых аргументов. Ранее некорректные аргументы могли приводить к неявным преобразованиям. Также были оптимизированы алгоритмы поиска для многобайтовых кодировок. В PHP 8.3 добавлены улучшения обработки крайних случаев при работе с пустыми строками.

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

Поиск с несколькими вхождениями
Пример php
function findAllOccurrences($haystack, $needle) {
    $positions = [];
    $offset = 0;
    while (($pos = mb_stripos($haystack, $needle, $offset)) !== false) {
        $positions[] = $pos;
        $offset = $pos + 1;
    }
    return $positions;
}

$text = 'Тест тест ТЕСТ';
$result = findAllOccurrences($text, 'тест');
print_r($result);
Array
(
    [0] => 0
    [1] => 5
    [2] => 10
)
Извлечение домена из email
Пример php
$email = 'USER@EXAMPLE.COM';
$domain = mb_stristr($email, '@', false);
echo ltrim($domain, '@');
EXAMPLE.COM
Обработка текста с переносами строк
Пример php
$text = "Первая строка\nВторая СТРОКА\nТретья строка";
$lines = explode("\n", $text);
foreach ($lines as $line) {
    if (mb_stristr($line, 'СТРОКА')) {
        echo $line . "\n";
    }
}
Вторая СТРОКА
Третья строка

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

Mb stristr в Python

text = 'Пример строки'
search = 'СТРОКИ'
result = text.lower().find(search.lower())
if result != -1:
    print(text[result:])
строки

Mb stristr в Javascript

let str = 'Пример строки';
let search = 'СТРОКИ';
let index = str.toLowerCase().indexOf(search.toLowerCase());
if (index !== -1) {
    console.log(str.substring(index));
}
строки

Mb stristr в MySQL

SELECT SUBSTRING('Пример строки', LOCATE('СТРОКИ', LOWER('Пример строки')));
строки

Основное отличие - в PHP функция встроена и поддерживает многобайтовость из коробки, тогда как в других языках часто требуется приведение к одному регистру.

PHP mb_stristr function comments

En
Mb stristr Finds first occurrence of a string within another, case insensitive