Преобразование youtube видеороликов Api v3 в php

как преобразовать PT2H34M25S в 2:34:25

Я искал и использовал этот код. Я новичок в регулярном выражении, может кто-нибудь объяснить это? и помогите мне с моей проблемой

function covtime($youtube_time){
        preg_match_all('/(\d+)/',$youtube_time,$parts);
        $hours = floor($parts[0][0]/60);
        $minutes = $parts[0][0]%60;
        $seconds = $parts[0][1];
        if($hours != 0)
            return $hours.':'.$minutes.':'.$seconds;
        else
            return $minutes.':'.$seconds;
    }   

но этот код дает мне только HH: MM

настолько тупой нашел решение:

   function covtime($youtube_time){
            preg_match_all('/(\d+)/',$youtube_time,$parts);
            $hours = $parts[0][0];
            $minutes = $parts[0][1];
            $seconds = $parts[0][2];
            if($seconds != 0)
                return $hours.':'.$minutes.':'.$seconds;
            else
                return $hours.':'.$minutes;
        }

Ответ 1

Вы должны взглянуть на свою переменную $parts после ее создания.

var_dump($parts);

Сравните этот результат с тем, как вы определяете свои переменные. После этого он должен выглядеть довольно очевидно.

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

Изменить: Вот обновленная функция для обработки отсутствующих числовых значений (если часы или минуты опущены) и секунд/часов более 60 (не уверен, что это когда-либо произойдет). Это не подтверждает метку чисел:

  • 1 номер: предположим, что это секунды
  • 2 числа: предположим, что это минуты, секунды
  • 3 или более чисел: предположим, что первые 3 числа - это часы, минуты, секунды (игнорирование других номеров)

Для проверки правильности ввода строки можно добавить дополнительную проверку.

<?php
function covtime($youtube_time) {
    preg_match_all('/(\d+)/',$youtube_time,$parts);

    // Put in zeros if we have less than 3 numbers.
    if (count($parts[0]) == 1) {
        array_unshift($parts[0], "0", "0");
    } elseif (count($parts[0]) == 2) {
        array_unshift($parts[0], "0");
    }

    $sec_init = $parts[0][2];
    $seconds = $sec_init%60;
    $seconds_overflow = floor($sec_init/60);

    $min_init = $parts[0][1] + $seconds_overflow;
    $minutes = ($min_init)%60;
    $minutes_overflow = floor(($min_init)/60);

    $hours = $parts[0][0] + $minutes_overflow;

    if($hours != 0)
        return $hours.':'.$minutes.':'.$seconds;
    else
        return $minutes.':'.$seconds;
}

Ответ 2

Использование класса DateTime

Для достижения этого вы можете использовать класс PHP DateTime. Это решение намного проще и будет работать, даже если формат величин в строке будет в другом порядке. В таких случаях разрывное решение (скорее всего) прерывается.

В PHP PT2H34M25S является допустимой строкой периода даты и понимается парсером DateTime. Затем мы воспользуемся этим фактом и просто добавим его в эпоху Unix с помощью метода add(). Затем вы можете отформатировать полученную дату для получения требуемых результатов:

function covtime($youtube_time){
    $start = new DateTime('@0'); // Unix epoch
    $start->add(new DateInterval($youtube_time));
    return $start->format('H:i:s');
}   

echo covtime('PT2H34M25S');

Демо

Ответ 3

Оба решения Амаль и Pferate великолепны! Тем не менее, решение Amal продолжает давать мне 1 ч. Ниже мое решение, которое совпадает с Amal, но разностным подходом и этой работой для меня.

$date = new DateTime('1970-01-01');
$date->add(new DateInterval('PT2H34M25S'));
echo $date->format('H:i:s')

datetime->add() ссылка

Ответ 4

Вот мое решение, которое обрабатывает отсутствует H, M или S (проверить видео с сообщенным длиной 1:00:01 и вы увидим проблему с другими ответами). Секунды представлены как 0:01, но если вы хотите изменить это, просто измените последнее на elseif($M>0) и добавьте еще в течение секунд, например. else { return ":$S" }

// convert youtube v3 api duration e.g. PT1M3S to HH:MM:SS
// updated to handle videos days long e.g. P1DT1M3S
function covtime($yt){
    $yt=str_replace(['P','T'],'',$yt);
    foreach(['D','H','M','S'] as $a){
        $pos=strpos($yt,$a);
        if($pos!==false) ${$a}=substr($yt,0,$pos); else { ${$a}=0; continue; }
        $yt=substr($yt,$pos+1);
    }
    if($D>0){
        $M=str_pad($M,2,'0',STR_PAD_LEFT);
        $S=str_pad($S,2,'0',STR_PAD_LEFT);
        return ($H+(24*$D)).":$M:$S"; // add days to hours
    } elseif($H>0){
        $M=str_pad($M,2,'0',STR_PAD_LEFT);
        $S=str_pad($S,2,'0',STR_PAD_LEFT);
        return "$H:$M:$S";
    } else {
        $S=str_pad($S,2,'0',STR_PAD_LEFT);
        return "$M:$S";
    }
}

Ответ 5

Это мое решение, тест завершен!

preg_match_all("/PT(\d+H)?(\d+M)?(\d+S)?/", $duration, $matches);

$hours   = strlen($matches[1][0]) == 0 ? 0 : substr($matches[1][0], 0, strlen($matches[1][0]) - 1);
$minutes = strlen($matches[2][0]) == 0 ? 0 : substr($matches[2][0], 0, strlen($matches[2][0]) - 1);
$seconds = strlen($matches[3][0]) == 0 ? 0 : substr($matches[3][0], 0, strlen($matches[3][0]) - 1);

return 3600 * $hours + 60 * $minutes + $seconds;

Ответ 6

Вот полный код для получения, конвертирования и отображения продолжительности видео

$vidkey = "           " ; // for example: cHPMH26sw2f
$apikey = "xxxxxxxxxxxx" ;

$dur = file_get_contents("https://www.googleapis.com/youtube/v3/videos?part=contentDetails&id=$vidkey&key=$apikey");
$VidDuration =json_decode($dur, true);
foreach ($VidDuration['items'] as $vidTime) 
{
$VidDuration= $vidTime['contentDetails']['duration'];
}
// convert duration from ISO to M:S
$date = new DateTime('2000-01-01');
$date->add(new DateInterval($VidDuration));
echo $date->format('i:s') ;

Замените xxxxxxx вашим ключом API Результаты: 13:07

Ответ 7

Почему осложнение. Думайте нестандартно.

    $seconds = substr(stristr($length, 'S', true), -2, 2);
    $seconds = preg_replace("/[^0-9]/", '', $seconds);
    $minutes =  substr(stristr($length, 'M', true), -2, 2);
    $minutes = preg_replace("/[^0-9]/", '', $minutes);
    $hours =  substr(stristr($length, 'H', true), -2, 2);
    $hours = preg_replace("/[^0-9]/", '', $hours);

OK. preg_replace действительно не требуется, но я полагаю, что он гарантирует только числа.

Затем для моего форматирования (который вы можете делать, но вам нравится без ограничений),

      if($hours == 0){ 
      $h= '';
      }else{ 
      $h= $hours.':';
      }

      if($minutes <10){ 
      $m= '0'.$minutes.':'; 
        if($h == ''){
        $m= $minutes.':'; 
        }
          if ($minutes == 0){
            $m= $minutes;                 
          }
      }else{ 
      $m= $minutes.':';
      }

      if($seconds <10){ 
      $s= '0'.$seconds; 
      }else{ 
      $s= $seconds;
      }
      $time= $h . $m . $s.'s';

Ответ 8

Попробуйте выполнить следующую функцию:

function covtime($youtube_time) 
{
    $hours = '0';
    $minutes = '0';
    $seconds = '0';

    $hIndex = strpos($youtube_time, 'H');
    $mIndex = strpos($youtube_time, 'M');
    $sIndex = strpos($youtube_time, 'S');
    $length = strlen($youtube_time);
    if($hIndex > 0)
    {
        $hours = substr($youtube_time, 2, ($hIndex - 2));
    }
    if($mIndex > 0)
    {
        if($hIndex > 0)
        {
            $minutes = substr($youtube_time, ($hIndex + 1), ($mIndex - ($hIndex + 1)));
        }      
        else
        {
            $minutes = substr($youtube_time, 2, ($mIndex - 2));
        }
    }
    if($sIndex > 0)
    {
        if($mIndex > 0)
        {
            $seconds = substr($youtube_time, ($mIndex + 1), ($sIndex - ($mIndex + 1)));
        }
        else if($hIndex > 0)
        {
            $seconds = substr($youtube_time, ($hIndex + 1), ($sIndex - ($hIndex + 1)));
        }      
        else
        {
            $seconds = substr($youtube_time, 2, ($sIndex - 2));
        }
    }
    return $hours.":".$minutes.":".$seconds;        
}

Ответ 9

Вы можете попробовать это -

function covtime($youtube_time){
    $start = new DateTime('@0'); // Unix epoch
    $start->add(new DateInterval($youtube_time));
    if (strlen($youtube_time)>8)
    {
    return $start->format('g:i:s');
}   else {
	return $start->format('i:s');
}
}

Ответ 10

DateTime и DateInterval не работают в Yii или некоторой версии php. Так что это мое решение. Его работа со мной.

function convertTime($time){        
    if ($time > 0){
        $time_result = '';
        $hours = intval($time / 3600);
        if ($hours > 0)
            $time_result = $time_result.$hours.':';
        $time = $time % 3600;
        $minutes = intval($time / 60);
        $seconds = $time % 60;
        $time_result = $time_result.(($minutes > 9)?$minutes:'0'.$minutes).':';
        $time_result = $time_result.(($seconds > 9)?$seconds:'0'.$seconds);
    }else 
        $time_result = '0:00';        

    return $time_result;
}