Mb substr count: примеры (PHP)
mb_substr_count(string $haystack, string $needle, ?string $encoding = null): intФункция mb_substr_count
Функция mb_substr_count() подсчитывает количество вхождений подстроки в строку. Эта функция предназначена для корректной работы с многобайтовыми кодировками, такими как UTF-8.
Функция применяется, когда необходимо узнать, сколько раз определенная последовательность символов встречается в тексте. Она является безопасной для строк в многобайтовых кодировках, в отличие от substr_count().
- haystack (
string): Строка, в которой производится поиск. Обязательный аргумент. - needle (
string): Подстрока, количество вхождений которой нужно найти. Обязательный аргумент. - encoding (
string|null): Параметр, указывающий кодировку строк. Если он не указан или равенnull, будет использована внутренняя кодировка скрипта (mb_internal_encoding()). Необязательный аргумент.
Примеры использования mb_substr_count
$text = "Съешь ещё этих мягких французских булок, да выпей чаю.";
echo mb_substr_count($text, ' ');8
$text = "Привет, мир!";
$count = mb_substr_count($text, 'р', 'UTF-8');
echo $count;2
$text = "PHP php Php pHP";
echo mb_substr_count($text, 'php'); // Регистрозависимый поиск1
$text = mb_convert_encoding("Пример текста", "CP1251", "UTF-8");
echo mb_substr_count($text, 'е', 'CP1251');2
Похожие функции в PHP
Основная альтернатива для однобайтовых кодировок. Не работает корректно с символами UTF-8, которые занимают более одного байта. Использовать только для строк в ASCII или однобайтовых кодировках.
Позволяет производить подсчет с использованием регулярных выражений, что дает гибкость в поиске сложных паттернов. Медленнее для простого подсчета конкретной подстроки.
mb_substr_count() является предпочтительным выбором для подсчета вхождений простой подстроки в текстах на любых языках (UTF-8). substr_count() можно использовать для работы с бинарными данными или гарантированно английским текстом. preg_match_all() нужен для подсчета по шаблону, например, всех цифр или слов.
Типичные ошибки
Если needle является пустой строкой (''), функция вернет количество символов в строке плюс 1. Это может быть неочевидно.
$text = "тест";
echo mb_substr_count($text, '');5
Указание неверной кодировки приводит к некорректному результату или предупреждению.
$text = "Пример";
// Неверно указана кодировка для UTF-8 строки
echo @mb_substr_count($text, 'п', 'ASCII');0
Если кодировка строки и переданная в функцию кодировка не совпадают, результат непредсказуем.
Изменения в версиях PHP
Начиная с PHP 7.0, параметр encoding может принимать значение null. В этом случае используется внутренняя кодировка. В версиях PHP до 7.0 этот параметр был обязательным. В PHP 8.0 функция не претерпела значительных изменений.
Расширенные примеры
$sentence = "Быстрый коричневый лис прыгнул через ленивую собаку.";
// Считаем пробелы и добавляем 1 (при условии нормального форматирования)
$wordCount = mb_substr_count($sentence, ' ') + 1;
echo "Слов в предложении: $wordCount";Слов в предложении: 9
Функция mb_substr_count() не подсчитывает перекрывающиеся вхождения.
$text = "аааа";
// Поиск "аа"
echo mb_substr_count($text, 'аа'); // Непересекающиеся вхождения2
$text = "Эх, чужак, общий съём цен шляп (юфть) – вдрузь!.";
$vowels = 'аеёиоуыэюяАЕЁИОУЫЭЮЯ';
$vowelCount = 0;
for ($i = 0; $i < mb_strlen($vowels); $i++) {
$vowel = mb_substr($vowels, $i, 1);
$vowelCount += mb_substr_count($text, $vowel);
}
echo "Гласных в тексте: $vowelCount";Гласных в тексте: 12
$phrases = [
"Здесь есть котик",
"А здесь нет",
"Котик и собака",
"Опять котик"
];
$searchWord = "котик";
$filtered = array_filter($phrases, fn($phrase) => mb_substr_count($phrase, $searchWord) > 0);
print_r($filtered);Array
(
[0] => Здесь есть котик
[2] => Котик и собака
[3] => Опять котик
)
Аналоги в других языках
Mb substr count в Python
Используется метод str.count(). В Python 3 строки по умолчанию являются Unicode.
text = "Съешь ещё этих мягких булок"
count = text.count('е')
print(count)3
Mb substr count в Javascript
Прямого аналога нет. Один из способов — использование метода match() с глобальным флагом или метод split().
let text = "Hello world world";
let count = (text.match(/world/g) || []).length;
console.log(count); // 2
// Или
let count2 = text.split('world').length - 1;
console.log(count2); // 22 2
Mb substr count в MySQL
Можно использовать функцию CHAR_LENGTH() в комбинации с REPLACE() для эмуляции подсчета.
SELECT (CHAR_LENGTH('банан') - CHAR_LENGTH(REPLACE('банан', 'ан', ''))) / CHAR_LENGTH('ан') AS count;2