PHP: Как проверить, является ли URL Youtube или Vimeo - PullRequest
12 голосов
/ 08 июля 2011

Как я могу написать функцию, чтобы проверить, являются ли предоставленные URL-адреса YouTube или Vimeo?

Например, у меня есть эти два URL, которые я храню в базе данных в виде строк,

http://vimeo.com/24456787

http://www.youtube.com/watch?v=rj18UQjPpGA&feature=player_embedded

Если URL-адрес YouTube, то я перепишу URL-адрес,

http://www.youtube.com/embed/rj18UQjPpGA?rel=0&wmode=transparent

Если URL-адрес vimeo, я перепишу этот URL-адрес на

http://vimeo.com/moogaloop.swf?clip_id=24456787

Спасибо.

Ответы [ 8 ]

27 голосов
/ 08 июля 2011

Используйте функцию parse_url, чтобы разделить URL-адрес, а затем просто выполните обычные проверки

$url = 'http://www.youtube.com/watch?v=rj18UQjPpGA&feature=player_embedded';
$parsed = parse_url($url);

даст вам этот массив

array
  'scheme' => string 'http' (length=4)
  'host' => string 'www.youtube.com' (length=15)
  'path' => string '/watch' (length=6)
  'query' => string 'v=rj18UQjPpGA&feature=player_embedded' (length=37)
13 голосов
/ 08 июля 2011

Как отмечают другие в комментариях, это быстрое и грязное решение , которое плохо обрабатывает крайние случаи. Если URL содержит «YouTube» (example.com/youtube), он вернет ложное срабатывание. Решение parse_url() , упомянутое ниже , является гораздо более надежным решением.


Регулярные выражения хорошо подходят для такого типа вещей, но часто strpos или substr являются более быстрыми с точки зрения производительности. Ознакомьтесь с документацией PHP для preg_match(). Ниже примеров есть примечание именно для этой вещи.

Вот код прототипа:

function videoType($url) {
    if (strpos($url, 'youtube') > 0) {
        return 'youtube';
    } elseif (strpos($url, 'vimeo') > 0) {
        return 'vimeo';
    } else {
        return 'unknown';
    }
}

Очевидно, что возвращать строку не лучшая идея, но вы понимаете, в чем дело. Подставьте свою собственную бизнес-логику.

11 голосов
/ 21 февраля 2014

Удивительно, что никто не упомянул, что URL-адреса YouTube также могут содержать домен 'youtu.be', и в этом случае все вышеперечисленные решения должны быть адаптированы для такой возможности.

4 голосов
/ 27 марта 2017

Я недавно написал эту функцию именно для этого, надеюсь, она кому-нибудь пригодится:

    /**
 * [determineVideoUrlType used to determine what kind of url is being submitted here]
 * @param  string $url either a YouTube or Vimeo URL string
 * @return array will return either "youtube","vimeo" or "none" and also the video id from the url
 */

public function determineVideoUrlType($url) {


    $yt_rx = '/^((?:https?:)?\/\/)?((?:www|m)\.)?((?:youtube\.com|youtu.be))(\/(?:[\w\-]+\?v=|embed\/|v\/)?)([\w\-]+)(\S+)?$/';
    $has_match_youtube = preg_match($yt_rx, $url, $yt_matches);


    $vm_rx = '/(https?:\/\/)?(www\.)?(player\.)?vimeo\.com\/([a-z]*\/)*([‌​0-9]{6,11})[?]?.*/';
    $has_match_vimeo = preg_match($vm_rx, $url, $vm_matches);


    //Then we want the video id which is:
    if($has_match_youtube) {
        $video_id = $yt_matches[5]; 
        $type = 'youtube';
    }
    elseif($has_match_vimeo) {
        $video_id = $vm_matches[5];
        $type = 'vimeo';
    }
    else {
        $video_id = 0;
        $type = 'none';
    }


    $data['video_id'] = $video_id;
    $data['video_type'] = $type;

    return $data;

}
3 голосов
/ 08 июля 2011

Поскольку все, что вы хотите сделать, это проверить наличие строки, используйте stripos .Если в нем нет youtube.com или vimeo.com, URL-адрес искажен, верно?stripos также нечувствителен к регистру.

if(stripos($url,'youtu')===false){
    //must be vimeo
    } else {
    //is youtube
    }
3 голосов
/ 08 июля 2011

Вы можете использовать preg_match():

$u1="http://vimeo.com/24456787";
$u2="http://www.youtube.com/watch?v=rj18UQjPpGA&feature=player_embedded";

if(preg_match('/http:\/\/(www\.)*vimeo\.com\/.*/',$u1)){
    // do vimeo stuff
    echo "Vimeo URL found!\n";
}

if(preg_match('/http:\/\/(www\.)*youtube\.com\/.*/',$u2)){
    // do youtube stuff
    echo "YouTube URL found!\n";
}
1 голос
/ 06 мая 2016

Вы можете попробовать мое решение:

function checkServer( $domains=array(), $url ) {
    foreach ( $domains as $domain ) {
        if ( strpos($url, $domain ) > 0) {
            return true;
        } else {
            return false;
        }
    }
}

Использование:

if( checkServer(array("youtube.com","youtu.be"), $url ) ) {
    //is Youtube url
}
elseif( checkServer(array("vimeo.com"), $url ) ) {
    //is Vimeo
}
elseif ( checkServer(array("any domain"), $url ) ) {
    //is Any Domain
}else {
    //unknow domain
}
0 голосов
/ 08 июля 2011

Используйте регулярные выражения . Какой язык вы используете?

Редактировать: заметил, что ваш тег был php. Было бы что-то вроде этого:

<?php
// get host name from URL
preg_match('@^(?:http://)?([^/]+)@i',
    "http://www.youtube.com/index.html", $matches);
$host = $matches[1];

// get last two segments of host name
preg_match('/[^.]+\.[^.]+$/', $host, $matches);
echo {$matches[0]}\n"; //youtube.com
?>
...