1

Substr count: примеры (PHP)

Работа с substr_count: подсчет подстрок в PHP
Раздел: Работа со строками
substr_count(string haystack, string needle [, int offset [, int length]]): int

Функция substr_count в PHP

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

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

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

  1. $haystack (обязательный) - строка, в которой производится поиск.
  2. $needle (обязательный) - искомая подстрока.
  3. $offset (необязательный) - позиция символа, с которой начинается поиск. Отрицательное значение отсчитывается от конца строки.
  4. $length (необязательный) - максимальная длина проверяемой части строки от позиции $offset. Отрицательное значение задает длину от конца строки.

Функция возвращает целое число вхождений подстроки. Поиск чувствителен к регистру.

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

Базовый пример
echo substr_count('hello world hello', 'hello');
2
С указанием смещения
echo substr_count('abcdefabc', 'abc', 3);
1
С отрицательным смещением
echo substr_count('test_test_test', 'test', -10);
2
С указанием длины
echo substr_count('aaaa', 'aa', 0, 3);
1
С отрицательной длиной
echo substr_count('xxxxxx', 'xx', 0, -3);
2

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

mb_substr_count

Аналог для многобайтовых кодировок. Используется при работе с UTF-8 и другими многобайтовыми строками. Имеет аналогичные параметры.

preg_match_all

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

strpos в цикле

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

Рекомендации: substr_count оптимальна для простого подсчета неперекрывающихся подстрок. Для UTF-8 используют mb_substr_count, для сложных паттернов - preg_match_all.

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

Перекрывающиеся подстроки

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

echo substr_count('aaaa', 'aa');
2

Ожидание 3 вхождений, но результат 2, так как поиск идет последовательно без перекрытий.

Пустая подстрока
echo substr_count('test', '');
Warning: substr_count(): Empty substring

В PHP 8.0 и выше пустая подстрока вызывает предупреждение. В более ранних версиях возвращала длину строки + 1.

Некорректные смещение и длина
echo substr_count('test', 't', 10);
Warning: substr_count(): Offset value 10 exceeds string length

Смещение или длина, выходящие за границы строки, вызывают предупреждение и возвращают false в старых версиях PHP.

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

Поведение с пустой подстрокой

До PHP 8.0 вызов с пустой подстрокой возвращал длину строки плюс один. Теперь вызывает предупреждение и возвращает 0.

// PHP 7.4
substr_count('test', ''); // 5
// PHP 8.0+
substr_count('test', ''); // Warning и 0
Приведение типов

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

Отрицательная длина

В PHP 7.4 добавлена поддержка отрицательных значений для параметра $length.

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

Проверка плотности ключевых слов
Пример php
$text = 'PHP - популярный язык. PHP используется для веба.';
$word = 'PHP';
$count = substr_count($text, $word);
$totalWords = str_word_count($text);
$density = $count / $totalWords * 100;
echo round($density, 2) . '%';
9.09%
Поиск с разными регистрами
Пример php
$text = 'Hello HELLO hello';
$count = substr_count(strtolower($text), 'hello');
echo $count;
3
Подсчет нескольких подстрок
Пример php
function countMultiple($haystack, $needles) {
    $total = 0;
    foreach ($needles as $needle) {
        $total += substr_count($haystack, $needle);
    }
    return $total;
}

echo countMultiple('abc123abc456', ['abc', '123']);
3
Анализ логов
Пример php
$log = "ERROR: Disk full\nINFO: Backup started\nERROR: Timeout\n";
$errors = substr_count($log, 'ERROR');
$info = substr_count($log, 'INFO');
echo "Errors: $errors, Info: $info";
Errors: 2, Info: 1
Проверка на наличие минимум N вхождений
Пример php
function hasMinOccurrences($haystack, $needle, $min) {
    return substr_count($haystack, $needle) >= $min;
}

var_dump(hasMinOccurrences('a-b-c-d-e', '-', 4));
bool(true)
Подсчет вхождений в части строки
Пример php
$data = 'Section1: val1,val2,val3;Section2: val4,val5';
$section1End = strpos($data, ';');
$section1 = substr($data, 0, $section1End);
echo substr_count($section1, 'val');
3

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

Python: str.count()
'hello world hello'.count('hello')
2

Не поддерживает параметры смещения и длины. Работает только с подстроками.

JavaScript: split() и match()
('hello world hello').split('hello').length - 1
2
('hello world hello').match(/hello/g)?.length || 0
2

Нет встроенной функции. Используют методы split или match с регулярными выражениями.

MySQL: LENGTH и REPLACE
SELECT (LENGTH('hello world hello') - LENGTH(REPLACE('hello world hello', 'hello', ''))) / LENGTH('hello') AS count;
2

Нет прямой функции. Используют комбинацию функций LENGTH и REPLACE.

Golang: strings.Count
strings.Count("hello world hello", "hello")
2

Аналогична Python, не поддерживает смещение и длину.

PHP substr_count function comments

En
Substr count Count the number of substring occurrences