Разобрать тайм коды

00:00 - Вступление;
01:24 - Композитор God of War;
02:47 - Секретный турнир Кратоса;
04:14 - Поиск поэм Квасира;
04:51 - Кто такой Квасир в мифологии?;
05:50 - Отсылка на Horizon: Zero Dawn;
06:49 - Отсылка на The Last of Us;
07:38 - Отсылка на God of War;
1:08:41 - Отсылка на Death Stranding;
12:22:34 - Властелин Колец;
13:10:41 - Брат Кратоса. 

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

Как разобрать текст, найти в нем таймкоды и получить на выходе массив

[[0,'Вступление'], [[84,'Композитор God of War']]

Где первое значение это время в секундах, второе значение - имя отрывка которое заканчивается переносом строки.

Возможно делать это и чтобы текст поправить, скажем время заменить, взять время в тег <span> и при этом массив формировать?


Ответы (1 шт):

Автор решения: UModeL

На PHP это будет выглядеть примерно так:

$sData = "00:00 - Вступление;
01:24 - Композитор God of War;
02:47 - Секретный турнир Кратоса;
04:14 - Поиск поэм Квасира;
04:51 - Кто такой Квасир в мифологии?;
05:50 - Отсылка на Horizon: Zero Dawn;
06:49 - Отсылка на The Last of Us;
07:38 - Отсылка на God of War;
1:08:41 - Отсылка на Death Stranding;
12:22:34 - Властелин Колец;
13:10:41 - Брат Кратоса.";

$aTimeline = [];
$aList = explode(";", $sData);

foreach ($aList as $sItem) {
  $aTrip = explode(" - ", trim($sItem, ".\x00..\x20"));
  $aTime = array_reverse(explode(":", $aTrip[0]));
  $aTrip[0] = $aTime[0] + $aTime[1] * 60 + (isset($aTime[2]) ? $aTime[2] : 0) * 3600;
  $aTimeline[] = $aTrip;
};

print_r($aTimeline);

Демонстрация аналогичного кода на JS:

let sData = `00:00 - Вступление;
01:24 - Композитор God of War;
02:47 - Секретный турнир Кратоса;
04:14 - Поиск поэм Квасира;
04:51 - Кто такой Квасир в мифологии?;
05:50 - Отсылка на Horizon: Zero Dawn;
06:49 - Отсылка на The Last of Us;
07:38 - Отсылка на God of War;
1:08:41 - Отсылка на Death Stranding;
12:22:34 - Властелин Колец;
13:10:41 - Брат Кратоса.`;

let aTimeline = [];
let aList = sData.split(';');

aList.forEach((sItem) => {
  let aTrip = sItem.replace(/^\s+|[\s\.]+$/g, '').split(' - ');
  let aTime = aTrip[0].split(':').reverse();
  aTrip[0] = parseInt(aTime[0]) + parseInt(aTime[1]) * 60 + parseInt((aTime[2] | 0)) * 3600;
  aTimeline.push(aTrip);
});

console.log(aTimeline);

→ Ссылка