Dan*_*har 18 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;
}
Run Code Online (Sandbox Code Playgroud)
但是这段代码只给我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;
}
Run Code Online (Sandbox Code Playgroud)
Ama*_*ali 27
您可以使用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');
Run Code Online (Sandbox Code Playgroud)
无论阿迈勒的和Pferate的解决方案是伟大的!然而,Amal解决方案继续给我1Hr额外.下面是我的解决方案,与Amal相同, 但差异方法和这项工作对我来说.
$date = new DateTime('1970-01-01');
$date->add(new DateInterval('PT2H34M25S'));
echo $date->format('H:i:s')
Run Code Online (Sandbox Code Playgroud)
这是我的解决方案,处理丢失的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";
}
}
Run Code Online (Sandbox Code Playgroud)