在php中转换youtube Api v3视频时长

时间:2014-06-24 17:54:05

标签: php regex youtube-api

如何将PT2H34M25S转换为2:34:25

我搜索并使用了这段代码。我是regex的新手可以有人解释一下吗?并帮助我解决我的问题

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;
        }

13 个答案:

答案 0 :(得分:25)

使用DateTime类

您可以使用PHP的DateTime类来实现此目的。这个解决方案要简单得多,即使字符串中数量的格式顺序不同,也能正常工作。在这种情况下,正则表达式解决方案(很可能)会中断。

在PHP中,PT2H34M25S是一个有效的日期句点字符串,DateTime解析器可以理解它。然后我们使用这个事实,并使用add()方法将其添加到Unix纪元。然后,您可以格式化结果日期以获得所需的结果:

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');

Demo

答案 1 :(得分:9)

Amal Pferate 的解决方案都很棒! 但是, Amal 解决方案一直给我1Hr额外费用。下面是我的解决方案,与 Amal 相同,但差异方法,这对我有用。

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

datetime->add() reference

答案 2 :(得分:5)

这是我处理丢失的H,M或S的解决方案(测试video with a reported length of 1:00:01,你会看到其他答案的问题)。单独的秒数显示为0:01,但如果您想要更改,只需将最后一个更改为Google Keyboard并添加其他秒数,例如elseif($M>0)

else { return ":$S" }

答案 3 :(得分:3)

您应该在创建$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;
}

答案 4 :(得分:2)

这是我的解决方案,测试完成了!

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;

答案 5 :(得分:1)

试试这会给你持续时间

function video_length($youtube_time)
{
    $duration = new \DateInterval($youtube_time);
    return $duration->h  * 3600 + $duration->i  * 60  + $duration->s;
}

答案 6 :(得分:1)

我使用两种类,一种用于调用YouTube API,另一种用于转换时间。这里简化了。

如您所见,YouTubeGet是一个静态类,但不是必须的。但是,由于DateInterval的工作方式(正在扩展),因此YouTubeDateInterval必须是一个实例。

class YouTubeGet{
static public function get_duration($video_id, $api_key){
        // $youtube_api_key
        $url = "https://www.googleapis.com/youtube/v3/videos?id={$video_id}&part=contentDetails&key={$api_key}";
        // Get and convert. This example uses wordpress wp_remote_get()
        // this could be replaced by file_get_contents($url);
        $response = wp_remote_get($url);

        // if using file_get_contents(), then remove ['body']
        $result = json_decode($response['body'], true);
        // I've converted to an array, but this works fine as an object
        if(isset($result['items'][0]['contentDetails']['duration'])){
            $duration = $result['items'][0]['contentDetails']['duration'];
            return self::convtime($duration);
        }
        return false;
    }

    static protected function convtime($youtube_time){
        $time = new YouTubeDateInterval($youtube_time);        
        return $time->to_seconds();
    }   

}

class YouTubeDateInterval extends DateInterval {
    public function to_seconds() 
      { 
        return ($this->y * 365 * 24 * 60 * 60) + 
               ($this->m * 30 * 24 * 60 * 60) + 
               ($this->d * 24 * 60 * 60) + 
               ($this->h * 60 * 60) + 
               ($this->i * 60) + 
               $this->s; 
      } 
}

用法是关于将iso 8601日期传递给YouTubeDateInterval。

$time = new YouTubeDateInterval('PT2H34M25S');
$duration_in_seconds = $time->to_seconds();

或通过YouTube获取api和视频ID密钥

$duration_in_seconds = YouTubeGet::get_duration('videoIdString','YouTubeApiKeyString');

答案 7 :(得分:0)

以下是获取,转换和显示视频时长的完整代码

$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

答案 8 :(得分:0)

$duration = new DateInterval($data['items'][0]['contentDetails']['duration']);
echo $duration->format('%H:%i:%s');

答案 9 :(得分:-1)

尝试以下功能:

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;        
}

答案 10 :(得分:-1)

你可以试试这个 -

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');
}
}

答案 11 :(得分:-1)

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;
}

答案 12 :(得分:-1)

为什么会出现并发症。在盒子外面思考。

    $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);

行。 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';