之前已经问过这个问题,我发现了这个问题:
但我正在寻找一些略有不同的东西。
我需要匹配Youtube I.D本身与所有可能的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://i2.ytimg.com/vi/-wtIMTCHWuI/hqdefault.jpg
是否有一个聪明的策略可用于匹配与所有这些格式兼容的视频I.D -wtIMTCHWuI
。我在考虑字符统计和匹配=
?
/
.
&
个字符。
答案 0 :(得分:49)
我必须为几周前编写的PHP类处理这个问题,最后得到一个匹配任何类型字符串的正则表达式:有或没有URL方案,有或没有子域,youtube.com URL字符串,youtu .be URL字符串并处理所有类型的参数排序。您可以查看at 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;
}
答案 1 :(得分:3)
我找到了这段代码this link:
<?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;
}
}
?>
我也在处理这个问题,如果你找到更好的解决方案,请告诉我。它并不能完全满足您对开箱即用图像的需求,但它可以很容易地进行调整。
答案 2 :(得分:0)
目前我正在使用它:
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;
}
}
它可以扩展,但现在它适用于大多数情况
答案 3 :(得分:0)
有点晚了,但是我今天写了这个正则表达式,它不仅识别链接,而且还通过匹配组6返回video_id
^(https?\:\/\/)?(www\.)?(youtube\.com|youtu\.?be)(\/)?(watch\?v=|\?v=)?(.*)$
https://gist.github.com/Shibizle/3c6707911ea716860786728d31f8e3e5
对其进行测试: https://regex101.com/r/l0m7yh/1
答案 4 :(得分:0)