Добавить время к временным меткам с помощью PHP?

У меня есть несколько файлов, в содержании которых есть временные метки, которые недостаточно точны.

Итак, я подумал, может ли PHP преобразовать нефиксированное количество временных меток в точные, не затрагивая при этом другой контент.

Например, преобразовать это

1 00:00:00,232 --> 00:00:05,665 Текст1

2 00:00:05,966 --> 00:00:08,909 Текст2

3 00:00:10,948 --> 00:00:14,550 Текст3

4 00:00:23,086 --> 00:00:25,817 Текст4

5 00:00:34,033 --> 00:00:35,847 Текст5

6 00:01:06,237 --> 00:01:07,716 Текст6

к этому

1 00:00:00,732 --> 00:00:06,165 Текст1

2 00:00:06,466 --> 00:00:09,409 Текст2

3 00:00:11,448 --> 00:00:15,050 Текст3

4 00:00:23,586 --> 00:00:26,317 Текст4

5 00:00:34,533 --> 00:00:36,347 Текст5

6 00:01:06,737 --> 00:01:08,216 Текст6

Так что в этом случае добавьте 0,5 секунды к каждой метке времени. Я знаю, что это возможно, но как?

$amount = $_POST['amount'];
$content = $_POST['text'];
$timestamp = ?
$newtime = $timestamp.$amount
$replacetime = str_replace($timestamp,$newtime,$content);
foreach(what to put here){
$replacetime;
}

person Community    schedule 26.12.2012    source источник
comment
Вы пытаетесь разобрать файл субтитров? Сначала прочитайте файл. Затем разберите его.   -  person Shiplu Mokaddim    schedule 26.12.2012
comment
@shiplu.mokadd.im Файл читается в $content, но мне интересно, как его разобрать.   -  person    schedule 26.12.2012


Ответы (1)


Кажется, вы хотите перенести время на субтитры. Хотя это можно сделать с помощью видеоплеера, вы все равно можете сделать это на PHP.

Сначала прочитайте файл.

$c = file_get_contents("...file.srt");

Извлеките содержимое

preg_match_all("|(\d+)[\r\n]+([\d,:]+) --> ([\d,:]+)[\r\n]+(.*)|", $c, $m);

Теперь добавьте 0.5 секунды для каждого времени.

$len = count($m[1]);
for($i=0;$i<$len; $i++){
    list($st, $sm)=explode(",", $m[2][$i]); // start time and milisecond
    // add 0.5 sec
    $sm+=500;
    if($sm>1000){
        $di = new DateInterval("P0000-00-00T$st");
        $di->add("P1S");
        $sm = $sm%1000;
        $st = $di->format("%H:%i:%s");
    }
    // store it back
    $m[2][$i] = "$st,$sm";
}

То же самое вы должны сделать для последнего времени. Вы также можете сделать это в том же цикле.

После этого верните его в исходный файл. Сначала попробуйте другой файл для проверки

for($i=0;$i<$len; $i++){
    fprintf($fh, "$m[1][$i]\n");
    fprintf($fh, "$m[2][$i] --> $m[3][$i]\n");
    fprintf($fh, "$m[3][$i]\n\n");
}
person Shiplu Mokaddim    schedule 26.12.2012
comment
Хороший! Я думаю. Я немного изменю это, чтобы оно соответствовало моей цели, не могли бы вы проверить, все ли в порядке? - person ; 26.12.2012
comment
Все в порядке. Но вы должны это проверить. Это идея. Не полное решение. - person Shiplu Mokaddim; 26.12.2012
comment
Моя версия создаст только внутреннюю ошибку сервера, что может быть не так? - person ; 26.12.2012
comment
А ваш просто запишет файл пустым :P Не могли бы вы разбить свой код на части, которые я мог бы легко понять? :) - person ; 26.12.2012