Php 从YouTube URL参数中提取分钟和秒(例如';02m12s';)
从youtube URL中提取分钟和秒数的最佳方法 其中Php 从YouTube URL参数中提取分钟和秒(例如';02m12s';),php,regex,string,youtube,Php,Regex,String,Youtube,从youtube URL中提取分钟和秒数的最佳方法 其中1m40s是我需要的字符串,可以使用“#t=”或“&t=” 也可能在最后(或者在中间,但不太可能。我会排除这个可能性) “xmxs”中的“x”可以是一位或两位数字,并且只能传递其中一位 “#t=10m3s”或 “&t=09m12s” 它们都是可选的,如中所示 “t=10m”或 “&t=3s”或 “#t=10m03”s YouTube现在接受这个短语的‘t’=’和‘&t=’,所以理想的是我需要同时考虑两者。用户将这些内容粘贴到博客的评论
1m40s
是我需要的字符串,可以使用“#t=”或“&t=”
也可能在最后(或者在中间,但不太可能。我会排除这个可能性)
“xmxs”中的“x”可以是一位或两位数字,并且只能传递其中一位
“#t=10m3s”或
“&t=09m12s”
它们都是可选的,如中所示
“t=10m”或
“&t=3s”或
“#t=10m03”s
YouTube现在接受这个短语的‘t’=’和‘&t=’,所以理想的是我需要同时考虑两者。用户将这些内容粘贴到博客的评论部分,输出结果将生成嵌入内容。我当前使用的脚本不解析这些时间值
一旦知道了分钟和秒数,我将把总秒数传递给使用“start”参数生成嵌入代码的脚本。我需要一个PHP解决方案。我假设substr()和regex是一个很好的组合。使用这个regex
((#)、|(\&))t=(\d+m)?(\d+s)?
我发现接受答案的代码非常混乱。它也不包括小时。另外,我认为YouTube删除了#
URL。我在WordPress插件中编写了这个函数。我认为这是相当干净的编码和方式更容易理解相比,接受的答案
我希望这能帮助别人
更新2019请注意,(int)部分去掉了h/m/s字符。我愿意听取改进建议
/**
* Calculates seconds based on youtube times
*
* @author Nicolas Jonas
* @license GPLv3
* @link http://nextgenthemes.com
*
* @param string $yttime The '1h25m13s' part of youtube URLs
*
* @return int Starttime in seconds
*/
function youtube_time_to_seconds( $yttime ) {
$matches['h'] = 0;
$matches['m'] = 0;
$matches['s'] = 0;
$pattern = '/' .
'(?<h>[0-9]+h)?' .
'(?<m>[0-9]+m)?' .
'(?<s>[0-9]+s)?/';
preg_match( $pattern, $yttime, $matches );
return ( (int) $matches['h'] * 60 * 60 ) +
( (int) $matches['m'] * 60 ) +
(int) $matches['s'];
}
资料来源:
可以这样使用:
它使用parse_URL
和parse_str
解析URL和参数,而不是重新注册整个URL,这是更好、更可靠的方法
$urls[] = 'http://youtu.be/vrXgLhkv21Y';
$urls[] = 'http://youtu.be/vrXgLhkv21Y?t=foobar';
$urls[] = 'http://youtu.be/vrXgLhkv21Y?foo=bar&t=4s';
$urls[] = 'http://youtu.be/vrXgLhkv21Y?t=1h19m14s';
$urls[] = 'http://youtu.be/vrXgLhkv21Y?t=19m14s';
$urls[] = 'http://youtu.be/vrXgLhkv21Y?t=2h';
$urls[] = 'http://youtu.be/vrXgLhkv21Y?t=5m';
$urls[] = 'http://youtu.be/vrXgLhkv21Y?t=50s';
#extract the part after the &t= in urls and run the function if exists
foreach( $urls as $url ) {
$parsed_url = parse_url( $url );
if ( empty( $parsed_url['query'] ) )
continue;
parse_str( $parsed_url['query'], $args );
if ( empty( $args['t'] ) )
continue;
echo youtube_time_to_seconds( $args['t'] ) . "\n";
}
输出:
4
4754
1154
7200
300
50
警告:preg\u match\u all()?@
。您错过了#t=10m
和&t=3s
@burning\u军团,我想没有必要。谢谢!但是,只有几分钟或几秒钟过去了,正则表达式似乎就不起作用了。正如我上面提到的,有时候只有一个会出现在url中:另一件事就是拆分两个值,这样我就可以将它们转换为秒。如果要将1M40转换为类似数组的数组('m'=>1,'s'=>40),最好的方法是什么?条件是原始字符串中只能传递一个。谢谢!太近了!我想它在几分钟内还是会失败,但是没有几秒钟,不是吗?这很好,但是您缺少了时间采用hm
或hs
格式(例如:1h1m、1h10s,两者都有效)的情况。您可以使用单个模式进行预匹配:'/([0-9]+h)?([0-9]+m)?([0-9]+s)?/'
来捕获时/分/秒。e、 g.:$hours=array\u key\u是否存在(1,$result)$结果[1]:0
@FabienSnauwaert您是对的,我添加了一个新的更简单的函数,没有使用array\u key\u exists
。
$urls[] = 'http://youtu.be/vrXgLhkv21Y';
$urls[] = 'http://youtu.be/vrXgLhkv21Y?t=foobar';
$urls[] = 'http://youtu.be/vrXgLhkv21Y?foo=bar&t=4s';
$urls[] = 'http://youtu.be/vrXgLhkv21Y?t=1h19m14s';
$urls[] = 'http://youtu.be/vrXgLhkv21Y?t=19m14s';
$urls[] = 'http://youtu.be/vrXgLhkv21Y?t=2h';
$urls[] = 'http://youtu.be/vrXgLhkv21Y?t=5m';
$urls[] = 'http://youtu.be/vrXgLhkv21Y?t=50s';
#extract the part after the &t= in urls and run the function if exists
foreach( $urls as $url ) {
$parsed_url = parse_url( $url );
if ( empty( $parsed_url['query'] ) )
continue;
parse_str( $parsed_url['query'], $args );
if ( empty( $args['t'] ) )
continue;
echo youtube_time_to_seconds( $args['t'] ) . "\n";
}
4
4754
1154
7200
300
50