3

YouTubeのURLから分と秒を抽出するための最良の方法は?

http://www.youtube.com/watch?v=TjTbNWhsG28#t=1m40s&foo=1&bar=2

ここ1m40sで、必要な文字列は「#t =」または「&t=」のいずれかを使用できます。

最後にもなる可能性があります(または途中ですが、ありそうにありません。私はそれを除外します)

http://www.youtube.com/watch?v=TjTbNWhsG28?foo=1&bar=2#t=1m40s

'xmxs'の'x'は1桁または2桁の数字であり、そのうちの1つだけが渡される可能性があります

「#t = 10m3s」または「&t=09m12s」

そしてそれらはそれぞれオプションです

「#t = 10m」または「&t = 3s」または「#t =10m03」

YouTubeは、このパラメータに「#t =」と「&t =」を受け入れるようになったため、理想的には両方を考慮する必要があります。ユーザーはこれらをブログのコメントセクションに貼り付け、出力によって埋め込みが生成されます。私が現在使用しているスクリプトは、これらの時間値を解析しません。

分と秒がわかったら、「start」パラメータを使用して埋め込みコードを生成するスクリプトに合計秒を渡します。 https://developers.google.com/youtube/player_parameters#start

PHPソリューションが必要です。substr()と正規表現の素晴らしい組み合わせを想定しています。

4

3 に答える 3

3

この正規表現を使用する((#)|(\&))t=(\d+m)?(\d+s)?

于 2012-07-05T19:16:55.887 に答える
3

受け入れられた回答のコードはかなり乱雑だと思います。また、時間をカバーしていません。#また、YouTubeがURLを削除したと思います。Advanced Responsive VideoEmbedderWordPressプラグイン内にこの関数をコーディングしています。受け入れられた答えと比較して、かなりきれいにコード化されており、理解しやすいと思います。

これが誰かに役立つことを願っています。

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

refの古いコード。ケース1h2sを考慮しません:

/**
 * 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 ) {

    $format = false;
    $hours  = $minutes = $seconds = 0;

    $pattern['hms'] = '/([0-9]+)h([0-9]+)m([0-9]+)s/'; // hours, minutes, seconds
    $pattern['ms']  =          '/([0-9]+)m([0-9]+)s/'; // minutes, seconds
    $pattern['h']   = '/([0-9]+)h/';
    $pattern['m']   = '/([0-9]+)m/';
    $pattern['s']   = '/([0-9]+)s/';

    foreach ( $pattern as $k => $v ) {

        preg_match( $v, $yttime, $result );

        if ( ! empty( $result ) ) {
            $format = $k;
            break;
        }
    }

    switch ( $format ) {
        case 'hms':
            $hours   = $result[1];
            $minutes = $result[2];
            $seconds = $result[3];
            break;
        case 'ms':
            $minutes = $result[1];
            $seconds = $result[2];
            break;
        case 'h':
            $hours = $result[1];
            break;
        case 'm':
            $minutes = $result[1];
            break;
        case 's':
            $seconds = $result[1];
            break;
        default:
            return false;
    }

    return ( $hours * 60 * 60 ) + ( $minutes * 60 ) + $seconds;
}

出典:Github

次のように使用できます。

これは、URL全体を再定義する代わりに、URLとパラメーターを解析します。これは、これを行うためのより優れた、より信頼性の高い方法parse_urlです。parse_str

$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
于 2014-03-31T13:40:26.497 に答える
2
$url = "http://www.youtube.com/watch?v=TjTbNWhsG28#t=40m&foo=1&bar=2";
$regex_pattern1 = "([#|\&]+t+\=+[0-9]+[m]+[0-9]+[s])"; // minutes and seconds
$regex_pattern2 = "([#|\&]+t+\=+[0-9]+[m])"; // only minutes
$regex_pattern3 = "([#|\&]+t+\=+[0-9]+[s])"; // only seconds
$pattern_used = null;
if(!preg_match_all($regex_pattern1, $url, $time)) // not found "#t=XmXs"
{
    if(!preg_match_all($regex_pattern2, $url, $time)) // not found "#t=Xm"
    {
        if(!preg_match_all($regex_pattern3, $url, $time)) // not found "#t=Xs"
            die("Invalid URL");
        else $pattern_used = 3;
    }   
    else $pattern_used = 2;
}
else $pattern_used = 1;
$time = substr($time[0][0], 3, strlen($time[0][0])); // deleting "#t="

//echo $time; // prints "1m40s" or "40s" if only seconds are given

// --------------
$pattern_minutes = "([0-9]+[s])";
$pattern_seconds = "([0-9]+[m])";
if($pattern_used == 1) // we have both minutes and seconds defined
{
    $minutes = preg_split($pattern_minutes, $time);
    $seconds = preg_split($pattern_seconds, $time);

    $array = array("minutes" => substr($minutes[0], 0, -1), 
                   "seconds" => substr($seconds[1], 0, -1));

    /* we have the following array now:
    array (size=2)
        'minutes' => string '1' (length=1)
        'seconds' => string '40' (length=2)*/
}
else
{
    if($pattern_used == 2) $time2 = preg_split($pattern_minutes, $time);
    else $time2 = preg_split($pattern_seconds, $time); 
    $time2 = substr($time2[0], 0, -1);
    echo $time2; // prints "40"
}
于 2012-07-05T19:30:17.257 に答える