Как написать функцию, чтобы проверить, являются ли предоставленные 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
Благодарю.
Регулярные выражения хорошо работают для такого типа вещей, но часто 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'; } }
Очевидно, что возвращение строки – не лучшая идея, но вы понимаете. Подставьте свою собственную бизнес-логику.
Как отмечают другие в комментариях, это быстрое и грязное решение, которое плохо справляется с краевыми случаями. Если url содержит «youtube» (example.com/youtube), он вернет ложный результат. Решение parse_url()
упомянутое ниже, является гораздо более надежным решением.
Используйте функцию 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)
Удивительно, что никто не упомянул, что URL-адреса youtube также могут содержать домен «youtu.be», и в этом случае все вышеупомянутые решения должны быть адаптированы для удовлетворения этой возможности.
Вы можете использовать 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"; }
Поскольку все, что вы хотите сделать, это проверить наличие строки, используйте stripos . Если в нем нет youtube.com или vimeo.com, URL-адрес неверен, правильно? stripos тоже нечувствителен к регистру.
if(stripos($url,'youtu')===false){ //must be vimeo } else { //is youtube }
Вы можете попробовать мое решение:
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 }
Я недавно написал эту функцию, чтобы сделать именно это, надеюсь, это кому-то полезно:
/** * [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\/([az]*\/)*([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; }
Используйте регулярные выражения . На каком языке вы используете?
Изменить: заметил, что ваш тег был 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 ?>