Mb substr count: примеры (PHP)

Работа с функцией mb_substr_count для подсчета вхождений в строках
Раздел: Многобайтовые строки
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

substr_count()

Основная альтернатива для однобайтовых кодировок. Не работает корректно с символами UTF-8, которые занимают более одного байта. Использовать только для строк в ASCII или однобайтовых кодировках.

preg_match_all()

Позволяет производить подсчет с использованием регулярных выражений, что дает гибкость в поиске сложных паттернов. Медленнее для простого подсчета конкретной подстроки.

Когда что использовать

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 функция не претерпела значительных изменений.

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

Подсчет слов в предложении
Пример php
$sentence = "Быстрый коричневый лис прыгнул через ленивую собаку.";
// Считаем пробелы и добавляем 1 (при условии нормального форматирования)
$wordCount = mb_substr_count($sentence, ' ') + 1;
echo "Слов в предложении: $wordCount";
Слов в предложении: 9
Поиск с перекрывающимися вхождениями

Функция mb_substr_count() не подсчитывает перекрывающиеся вхождения.

Пример php
$text = "аааа";
// Поиск "аа"
echo mb_substr_count($text, 'аа'); // Непересекающиеся вхождения
2
Анализ текста: подсчет гласных
Пример php
$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
Использование в callback для фильтрации массива
Пример php
$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); // 2
2
2

Mb substr count в MySQL

Можно использовать функцию CHAR_LENGTH() в комбинации с REPLACE() для эмуляции подсчета.

SELECT (CHAR_LENGTH('банан') - CHAR_LENGTH(REPLACE('банан', 'ан', ''))) / CHAR_LENGTH('ан') AS count;
2

PHP mb_substr_count function comments

En
Mb substr count Count the number of substring occurrences