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

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

Функция mb_strstr в PHP

Функция mb_strstr() является частью расширения mbstring (многобайтовые строки) и выполняет поиск первого вхождения подстроки в строке, учитывая кодировку символов. Основное применение — работа с многобайтовыми кодировками, такими как UTF-8, где обычные строковые функции могут работать некорректно.

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

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

  1. haystack (string) — строка, в которой выполняется поиск.
  2. needle (string) — искомая подстрока.
  3. before_needle (bool) — если параметр равен true, функция возвращает часть строки haystack до первого вхождения needle (исключая саму needle). По умолчанию false.
  4. encoding (string|null) — кодировка входной строки. Если не указана, используется внутренняя кодировка.

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

Базовый поиск подстроки
<?php
$text = 'Привет, мир!';
$result = mb_strstr($text, 'мир');
echo $result;
?>
мир!
Использование параметра before_needle
<?php
$text = 'email@example.com';
$result = mb_strstr($text, '@', true);
echo $result;
?>
email
Указание кодировки
<?php
$text = 'строка в UTF-8';
$result = mb_strstr($text, 'в', false, 'UTF-8');
echo $result;
?>
в UTF-8

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

Ряд функций выполняют схожие задачи:

  • strstr() — аналогична mb_strstr, но не поддерживает многобайтовые кодировки. Используется для однобайтовых строк.
  • mb_stristr() — выполняет поиск без учёта регистра символов.
  • strpos() / mb_strpos() — возвращают позицию первого вхождения подстроки, а не часть строки. Эффективны для проверки наличия подстроки.
  • preg_match() — подходит для сложного поиска с использованием регулярных выражений.

Для работы с UTF-8 и другими многобайтовыми кодировками предпочтительны функции с префиксом mb_.

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

Использование с однобайтовой функцией
<?php
$text = 'строка';
$result = strstr($text, 'с'); // Может работать некорректно с UTF-8
?>
Неправильная кодировка
<?php
$text = 'строка';
$result = mb_strstr($text, 'с', false, 'ASCII'); // Искажение символов
?>
Пустая искомая строка
<?php
$result = mb_strstr('текст', ''); // Вернёт false в PHP 8+
?>

Изменения в PHP 8

В PHP 8.0 параметр needle теперь принимает только строковые значения. Передача целого числа (код символа) больше не поддерживается. В случае передачи пустой строки функция возвращает false.

<?php
// PHP 7: искала символ с кодом 0
// PHP 8: ошибка типа, если передано не строка
$result = mb_strstr('abc', 0);
?>

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

Обработка нескольких вхождений
Пример php
<?php
function mb_strstr_all($haystack, $needle) {
    $result = [];
    $offset = 0;
    while (($pos = mb_strpos($haystack, $needle, $offset)) !== false) {
        $result[] = mb_strstr(mb_substr($haystack, $pos), $needle);
        $offset = $pos + 1;
    }
    return $result;
}
print_r(mb_strstr_all('тест тест', 'те'));
?>
Array
(
    [0] => тест тест
    [1] => тест
)
Использование с HTML-сущностями
Пример php
<?php
$html = '<p>Пример &nbsp; текста</p>';
$result = mb_strstr($html, '&nbsp;', true);
echo $result;
?>
<p>Пример
Поиск с учётом регистра и без
Пример php
<?php
$text = 'Привет, Мир!';
$result1 = mb_strstr($text, 'мир'); // false
$result2 = mb_stristr($text, 'мир'); // 'Мир!'
echo $result2;
?>
Мир!

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

Python
text = 'Привет, мир!'
result = text.split('мир', 1)[1]
print(result)
!
JavaScript
let text = 'Привет, мир!';
let result = text.substring(text.indexOf('мир'));
console.log(result);
мир!
MySQL
SELECT SUBSTRING('Привет, мир!', LOCATE('мир', 'Привет, мир!'));
мир!

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

PHP mb_strstr function comments

En
Mb strstr Finds first occurrence of a string within another