Как бы так объяснить
Использовать регулярки не следует при обработке большой строки.
Я бы делал следующим образом.
При решении я опираюсь на:
1. размер даты (длина подстроки с датой) имеет постоянную или максимальную длину (по задаче 19 символов)
Нам для этого нужно:
1. объявить массив для найденных частей. пусть будет $parts = array();
2. текущую часть. $currentPart = '';
3. контрольная строка (та, которая длиной всегда 19 символов)
Алгоритм:
1. Берем первые 19 символов и кладем в контрольную строку.
2. Проверяем контрольную строку на наличие даты. Можно регулярным выражением или например прогонять через strtotime и смотреть отличен ли результат от нуля или нет.
3. В случае, если это дата, то что в данный момент находится в $currentPart кладем в $parts. $currentPart чистим.
4. Далее считываем еще один символ и кладем его в конец контрольной строки, а первый ее символ удаляем из очереди и кладем в $currentPart(на манер очереди). Возвращаемся в пункт 2.
UPD: один нюанс - после удачной проверки на дату, нужно обеспечить несрабатывание проверки на эту же дату после смещения на один или более символов, пока дата еще есть в строке. Для этого можно, допустим, ставить флаг на игнор проверки в течение 19 итераций после совпадения.