Этот вопрос был задан раньше, и я нашел следующее:
Reg exp для youtube link
но я ищу что-то немного другое.
Мне нужно совместить идентификатор Youtube, совместимый со всеми возможными форматами ссылок на YouTube. Не только с youtube.com.
Например:
http://www.youtube.com/watch?v=-wtIMTCHWuI
http://www.youtube.com/v/-wtIMTCHWuI?version=3&autohide=1
http://youtu.be/-wtIMTCHWuI
http://www.youtube.com/oembed?url=http%3A//www.youtube.com/watch?v%3D-wtIMTCHWuI&format=json
http://s.ytimg.com/yt/favicon-wtIMTCHWuI.ico
http://img.ruphp.com/format/hqdefault.jpg
есть ли умная стратегия, которую я могу использовать для соответствия ID видео- -wtIMTCHWuI
совместимого со всеми этими форматами. Я думаю, что подсчет персонажей и соответствие =
?
/
.
&
символы.
Мне пришлось иметь дело с этим для класса PHP, который я написал несколько недель назад, и закончил с регулярным выражением, которое соответствует любому типу строк: с или без схемы URL, с субдоменом или без него, строки URL youtube.com, URL youtu.be строк и обработки всех видов сортировки параметров. Вы можете проверить это в 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\.|m\.)?(?:youtu\.be/|youtube\.com/(?:embed/|v/|watch\?v=|watch\?.+&v=))([\w-]{11})(?![\w-])#'; preg_match($pattern, $url, $matches); return (isset($matches[1])) ? $matches[1] : false; }
Тестовые примеры: https://3v4l.org/GEDT0
Версия JavaScript: https://stackoverflow.com/a/10315969/624466
Чтобы объяснить регулярное выражение, вот разделенная версия:
/** * 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, or protocol-relative. . '(?:www\.|m\.)?' # Optional www or m subdomain. . '(?:' # Group host alternatives: . 'youtu\.be/' # Either youtu.be, . '|youtube\.com/' # or youtube.com . '(?:' # Group path alternatives: . 'embed/' # Either /embed/, . '|v/' # or /v/, . '|watch\?v=' # or /watch?v=, . '|watch\?.+&v=' # or /watch?other_param&v= . ')' # End path alternatives. . ')' # End host alternatives. . '([\w-]{11})' # 11 characters (Length of Youtube video ids). . '(?![\w-])#'; # Rejects if overlong id. preg_match($pattern, $url, $matches); return (isset($matches[1])) ? $matches[1] : false; }
Я нашел этот код для этой ссылки :
<?php /** * parse_youtube_url() PHP function * Author: takien * URL: http://takien.com * * @param string $url URL to be parsed, eg: * http://youtu.be/zc0s358b3Ys, * http://www.youtube.com/embed/zc0s358b3Ys * http://www.youtube.com/watch?v=zc0s358b3Ys * @param string $return what to return * - embed, return embed code * - thumb, return URL to thumbnail image * - hqthumb, return URL to high quality thumbnail image. * @param string $width width of embeded video, default 560 * @param string $height height of embeded video, default 349 * @param string $rel whether embeded video to show related video after play or not. */ function parse_youtube_url($url,$return='embed',$width='',$height='',$rel=0){ $urls = parse_url($url); //expect url is http://youtu.be/abcd, where abcd is video iD if($urls['host'] == 'youtu.be'){ $id = ltrim($urls['path'],'/'); } //expect url is http://www.youtube.com/embed/abcd else if(strpos($urls['path'],'embed') == 1){ $id = end(explode('/',$urls['path'])); } //expect url is abcd only else if(strpos($url,'/')===false){ $id = $url; } //expect url is http://www.youtube.com/watch?v=abcd else{ parse_str($urls['query']); $id = $v; } //return embed iframe if($return == 'embed'){ return '<iframe width="'.($width?$width:560).'" height="'.($height?$height:349).'" src="http://www.youtube.com/embed/'.$id.'?rel='.$rel.'" frameborder="0" allowfullscreen>'; } //return normal thumb else if($return == 'thumb'){ return 'http://i1.ytimg.com/vi/'.$id.'/default.jpg'; } //return hqthumb else if($return == 'hqthumb'){ return 'http://i1.ytimg.com/vi/'.$id.'/hqdefault.jpg'; } // else return id else{ return $id; } } ?>
Я имею дело с этим слишком, так что если вы найдете лучшее решение, пожалуйста, дайте мне знать. Это не совсем то, что вам нужно для изображений из коробки, но может быть легко адаптировано.
В настоящее время я использую это:
function _getYoutubeVideoId($url) { $parts = parse_url($url); //For seriously malformed urls if ($parts === false) { return false; } switch ($parts['host']) { case 'youtu.be': return substr($parts['path'], 1); break; case 'youtube.com': case 'www.youtube.com': parse_str($parts['query'], $params); return $params['v']; break; default: return false; break; } }
Он может быть расширен, но сейчас он работает для большинства случаев