Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从YouTube URL参数中提取分钟和秒(例如';02m12s';)_Php_Regex_String_Youtube - Fatal编程技术网

Php 从YouTube URL参数中提取分钟和秒(例如';02m12s';)

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=’,所以理想的是我需要同时考虑两者。用户将这些内容粘贴到博客的评论

从youtube URL中提取分钟和秒数的最佳方法

其中
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