Substr count: примеры (PHP)
substr_count(string haystack, string needle [, int offset [, int length]]): intФункция substr_count в PHP
Функция substr_count() подсчитывает количество вхождений подстроки в строку. Она используется для анализа текстовых данных, когда необходимо узнать частоту появления определенного фрагмента.
Функция принимает до четырех параметров:
- $haystack (обязательный) - строка, в которой производится поиск.
- $needle (обязательный) - искомая подстрока.
- $offset (необязательный) - позиция символа, с которой начинается поиск. Отрицательное значение отсчитывается от конца строки.
- $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
Аналог для многобайтовых кодировок. Используется при работе с UTF-8 и другими многобайтовыми строками. Имеет аналогичные параметры.
Подсчитывает количество совпадений регулярного выражения. Применяется для сложных паттернов поиска, но работает медленнее.
Позволяет найти все вхождения с более гибкой логикой, например, с перекрывающимися подстроками.
Рекомендации: 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.
Расширенные примеры
$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%
$text = 'Hello HELLO hello';
$count = substr_count(strtolower($text), 'hello');
echo $count;3
function countMultiple($haystack, $needles) {
$total = 0;
foreach ($needles as $needle) {
$total += substr_count($haystack, $needle);
}
return $total;
}
echo countMultiple('abc123abc456', ['abc', '123']);3
$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
function hasMinOccurrences($haystack, $needle, $min) {
return substr_count($haystack, $needle) >= $min;
}
var_dump(hasMinOccurrences('a-b-c-d-e', '-', 4));bool(true)
$data = 'Section1: val1,val2,val3;Section2: val4,val5';
$section1End = strpos($data, ';');
$section1 = substr($data, 0, $section1End);
echo substr_count($section1, 'val');3
Аналоги в других языках
'hello world hello'.count('hello')2
Не поддерживает параметры смещения и длины. Работает только с подстроками.
('hello world hello').split('hello').length - 12
('hello world hello').match(/hello/g)?.length || 02
Нет встроенной функции. Используют методы split или match с регулярными выражениями.
SELECT (LENGTH('hello world hello') - LENGTH(REPLACE('hello world hello', 'hello', ''))) / LENGTH('hello') AS count;2
Нет прямой функции. Используют комбинацию функций LENGTH и REPLACE.
strings.Count("hello world hello", "hello")2
Аналогична Python, не поддерживает смещение и длину.