Получить идентификатор видео YouTube из URL с PHP - PullRequest
0 голосов
/ 28 августа 2011

Я пытаюсь создать функцию, которая вызывает значение из пользовательского поля Wordpress («_videourl» для URL-адреса видео YouTube), а затем использует обрезку PHP, чтобы сократить его до идентификатора видео YouTube.Я нашел функцию javascript, которая сокращает URL-адреса только до идентификатора, но я понятия не имею, как я смогу перевести это в php (функция ниже):

     function youtubeIDextract(url) 
     { 
     var youtube_id; 
     youtube_id = url.replace(/^[^v]+v.(.{11}).*/,"$1"); 
     return youtube_id; 
     }

Эта функция PHP будет использоваться внутрицикл, так что я думаю Я должен был бы использовать переменные, но я на самом деле просто нуб, поэтому я понятия не имею, что делать.Может ли кто-нибудь помочь, поделившись своими знаниями в области программирования, помогая мне создать функцию PHP?

РЕДАКТИРОВАТЬ: РЕШЕНО

После некоторых экспериментов я нашел решение.Я хотел вернуться и опубликовать его, чтобы у других, кто также в этом нуждался, было с чего начать.

function getYoutubeId($ytURL) 
    {
        $urlData = parse_url($ytURL);
        //echo '<br>'.$urlData["host"].'<br>';
        if($urlData["host"] == 'www.youtube.com') // Check for valid youtube url
        {
            $ytvIDlen = 11; // This is the length of YouTube's video IDs

            // The ID string starts after "v=", which is usually right after 
            // "youtube.com/watch?" in the URL
            $idStarts = strpos($ytURL, "?v=");

            // In case the "v=" is NOT right after the "?" (not likely, but I like to keep my 
            // bases covered), it will be after an "&":
            if($idStarts === FALSE)
                $idStarts = strpos($ytURL, "&v=");
            // If still FALSE, URL doesn't have a vid ID
            if($idStarts === FALSE)
                die("YouTube video ID not found. Please double-check your URL.");

            // Offset the start location to match the beginning of the ID string
            $idStarts +=3;

            // Get the ID string and return it
            $ytvID = substr($ytURL, $idStarts, $ytvIDlen);

            return $ytvID;
        }
        else
        {
            //echo 'This is not a valid youtube video url. Please, give a valid url...';
            return 0;
        }

    } 

Ответы [ 2 ]

13 голосов
/ 10 мая 2012

Мне пришлось разобраться с этим для класса PHP, который я написал несколько недель назад, и в итоге получил регулярное выражение, которое соответствует любому виду строк: с или без схемы URL, с или без субдомена, строки URL-адреса youtube.com, youtu.be URL строки и работа со всеми видами сортировки параметров.Вы можете проверить это на GitHub или просто скопировать и вставить следующий блок кода:

/**
 *  Check if input string is a valid YouTube URL
 *  and try to extract the YouTube Video ID from it.
 *  @author  Stephan Schmitz <eyecatchup@gmail.com>
 *  @param   $url   string   The string that shall be checked.
 *  @return  mixed           Returns YouTube Video ID, or (boolean) false.
 */        
function parse_yturl($url) 
{
    $pattern = '#^(?:https?://)?(?:www\.)?(?:youtu\.be/|youtube\.com(?:/embed/|/v/|/watch\?v=|/watch\?.+&v=))([\w-]{11})(?:.+)?$#x';
    preg_match($pattern, $url, $matches);
    return (isset($matches[1])) ? $matches[1] : false;
}

Чтобы объяснить регулярное выражение, вот расширенная версия:

/**
 *  Check if input string is a valid YouTube URL
 *  and try to extract the YouTube Video ID from it.
 *  @author  Stephan Schmitz <eyecatchup@gmail.com>
 *  @param   $url   string   The string that shall be checked.
 *  @return  mixed           Returns YouTube Video ID, or (boolean) false.
 */        
function parse_yturl($url) 
{
    $pattern = '#^(?:https?://)?';    # Optional URL scheme. Either http or https.
    $pattern .= '(?:www\.)?';         #  Optional www subdomain.
    $pattern .= '(?:';                #  Group host alternatives:
    $pattern .=   'youtu\.be/';       #    Either youtu.be,
    $pattern .=   '|youtube\.com';    #    or youtube.com
    $pattern .=   '(?:';              #    Group path alternatives:
    $pattern .=     '/embed/';        #      Either /embed/,
    $pattern .=     '|/v/';           #      or /v/,
    $pattern .=     '|/watch\?v=';    #      or /watch?v=,    
    $pattern .=     '|/watch\?.+&v='; #      or /watch?other_param&v=
    $pattern .=   ')';                #    End path alternatives.
    $pattern .= ')';                  #  End host alternatives.
    $pattern .= '([\w-]{11})';        # 11 characters (Length of Youtube video ids).
    $pattern .= '(?:.+)?$#x';         # Optional other ending URL parameters.
    preg_match($pattern, $url, $matches);
    return (isset($matches[1])) ? $matches[1] : false;
}
0 голосов
/ 28 августа 2011

Предполагая, что регулярное выражение верно, вы можете использовать preg_replace

$youtubeId = preg_replace('/^[^v]+v.(.{11}).*/', '$1', $url);

Вас также может заинтересовать str_replace или substr в качестве альтернативы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...