Greetings Perhaps the solution is not the most elegant, if anything, modify it yourself! ;)
Text in file:
Понедельник, 21 августа Сервер работает Вторник, 22 августа Сервер упал Среда, 23 августа Сервер работает Сервер работает Среда, 24 августа Сервер упал Вторник, 25 августа
$text_arr = file("t.txt"); $days = [ '/^Понедельник+/', '/^Вторник+/', '/^Среда+/', '/^Четверг+/', '/^Пятница+/', '/^Суббота+/', '/^Воскресенье+/', ]; $keys = []; $result = []; /** * Перебираем массив паттернов и проверяем вхождения по тексту * отсекая пустые элементы, и записываем в $keys порядковый номер строки с датой * Все последующие id между ними, наши будущие массивы с текстом. * На выходе получаем массив вида: * [0]=> int(0) [1]=> int(2) [2]=> int(9) [3]=> int(4) [4]=> int(7) ... */ foreach ($days as $day): $search = preg_grep($day, $text_arr); if (!empty($search)): foreach ($search as $id => $chunk): array_push($keys, $id); endforeach; else: continue; endif; endforeach; /** Сортируем массив по значениям, по порядку, т.к. парсить текст мы будем сверху вниз */ sort($keys); /** * Увеличиваем наши id на 1, для того чтобы не включать даты в результат * Обрезаем массив по отступу, где стартовым отступом будет найденный выше id, * а длинной отступа будет разница, между id следующего элемента и текущего. */ foreach ($keys as $id => $key): ++$key; if (++$id != count($keys)): array_push($result, array_slice($text_arr, $key, next($keys) - $key)); else: array_push($result, array_slice($text_arr, $key)); endif; endforeach;
Result:
array(5) { [0]=> array(1) { [0]=> string(31) "Сервер работает" } [1]=> array(1) { [0]=> string(23) "Сервер упал" } [2]=> array(2) { [0]=> string(31) "Сервер работает " [1]=> string(31) "Сервер работает" } [3]=> array(1) { [0]=> string(23) "Сервер упал" } [4]=> array(0) { } }