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, где обычные строковые функции могут работать некорректно.
Функция принимает до четырёх параметров:
- haystack (string) — строка, в которой выполняется поиск.
- needle (string) — искомая подстрока.
- before_needle (bool) — если параметр равен true, функция возвращает часть строки haystack до первого вхождения needle (исключая саму needle). По умолчанию false.
- encoding (string|null) — кодировка входной строки. Если не указана, используется внутренняя кодировка.
Примеры использования mb_strstr
<?php
$text = 'Привет, мир!';
$result = mb_strstr($text, 'мир');
echo $result;
?>мир!
<?php
$text = 'email@example.com';
$result = mb_strstr($text, '@', true);
echo $result;
?><?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
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] => тест
)<?php
$html = '<p>Пример текста</p>';
$result = mb_strstr($html, ' ', true);
echo $result;
?><p>Пример
<?php
$text = 'Привет, Мир!';
$result1 = mb_strstr($text, 'мир'); // false
$result2 = mb_stristr($text, 'мир'); // 'Мир!'
echo $result2;
?>Мир!
Аналоги функции в других языках
text = 'Привет, мир!'
result = text.split('мир', 1)[1]
print(result)!
let text = 'Привет, мир!';
let result = text.substring(text.indexOf('мир'));
console.log(result);мир!
SELECT SUBSTRING('Привет, мир!', LOCATE('мир', 'Привет, мир!'));мир!
В отличие от PHP, в этих языках обычно нет отдельной функции, полностью аналогичной mb_strstr, но аналогичного поведения можно достичь комбинацией методов.