Во-первых, наивный подход к регулярным выражениям для этого был бы довольно тривиальным, если бы во всех примерах были разделы часа, минуты и секунды, как показано:
/PT(\d+)H(\d+)M(\d+)S/
Каждый (\d+)
означает «сопоставить 1 или более цифр и записать результат в переменную для последующего использования», а все остальное просто соответствует буквенным символам.
Во-вторых, как указано в комментариях, это стандартное представление ISO 8601 временного интервала, продолжительности или периода, которое разбивается следующим образом:
- «P» для «Период» (чтобы уточнить, что это не абсолютная дата)
- «T» для «времени» (необходимо, потому что «M» может означать месяц или минуту, в зависимости от того, где оно появляется)
- «3165H» для 316 часов (нет ограничений на количество часов меньше 24)
- "52M" в течение 52 минут
- "12S" на 12 секунд
Поскольку это стандарт, он принимается как ввод по умолчанию для DateInterval
класса , поэтому вы можете просто написать:
$foo = new \DateInterval('PT3165H52M12S');
Затем вы можете использовать свойства и методы этого класса для доступа к информации об интервале, преобразования ее в формат по вашему выбору или добавления / вычитания из абсолютной даты-времени.