Intereting Posts
Класс «SEOstats \ SEOstats» не найден при вызове экземпляров SEOStats в laravel 5.3 Кэширование PHP – быстрее ли сохранять в базе данных или создавать файл? Postgres pg_dump удаляет базу данных в другом порядке каждый раз Сортировка многомерного массива Условная инструкция mySQL. Если true UPDATE, если false INSERT __autoload не может выдать исключение, если он не загружает класс при вызове статического метода получение списка с использованием foreach в javascript внутри php codeigniter PHP – Как избежать ошибок Parse на старых серверах при использовании новых функций PHP – Неопределенная переменная php-fpm для Windows? PHP Прогулка по многомерному массиву при сохранении ключей Codeigniter – Завершение сеанса и функция «запомнить меня» NginX выдает ошибку HTTP 499 через 60 секунд, несмотря на конфигурацию. (PHP и AWS) Есть ли способ использовать инструкции подготовки wpdb для массива implode ('OR', $ myArray)? Ошибка синтаксиса MySQL говорит «около 1», но у меня нет «1» в моем запросе

PHP: как проверить, является ли URL-адрес Youtube или vimeo's

Как написать функцию, чтобы проверить, являются ли предоставленные 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 ?>