关于javascript:如何从网址获取YouTube视频ID?

How do I get the YouTube video ID from a URL?

我想用javascript(没有jquery,纯javascript)从youtube的url获取v=id

YouTube URL格式示例

江户十一〔一〕号

埃多克斯1〔2〕

或任何其他YouTube格式,其中包含URL中的视频ID。

这些格式的结果

埃多克斯1〔3〕


我对"jeffreypriebe"提供的regex做了一个增强,因为他需要一种YouTube的URL,当他们通过一个频道观看时,这个URL就是视频的URL。

不,但这是我所装备的功能。

1
2
3
4
5
6
<script type="text/javascript">
function youtube_parser(url){
    var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/;
    var match = url.match(regExp);
    return (match&&match[7].length==11)? match[7] : false;
}

这些是支持的URL类型

1
2
3
4
5
6
7
http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index
http://www.youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/QdK8U-VIH_o
http://www.youtube.com/v/0zM3nApSvMg?fs=1&amp;hl=en_US&amp;rel=0
http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s
http://www.youtube.com/embed/0zM3nApSvMg?rel=0
http://www.youtube.com/watch?v=0zM3nApSvMg
http://youtu.be/0zM3nApSvMg

可在[http://web.archive.org/web/20160926134334/]中找到。http://lasnv.net/foro/839/javascript_parsar_url_de_youtube


我把lasnv的答案简化了一点。

它还修复了WebDeb描述的错误。

这里是:

1
2
3
4
5
6
7
var regExp = /^.*(youtu\.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/;
var match = url.match(regExp);
if (match && match[2].length == 11) {
  return match[2];
} else {
  //error
}

这里有一个regexer链接可以用来玩:http://regexr.com/3dnqv


您不需要为此使用正则表达式。

1
2
3
4
5
var video_id = window.location.search.split('v=')[1];
var ampersandPosition = video_id.indexOf('&');
if(ampersandPosition != -1) {
  video_id = video_id.substring(0, ampersandPosition);
}


截至2015年1月1日,这些都没有在厨房水槽上运行,尤其是没有Protocal HTTP/S和YouTube Nocookie域名的URL。所以这里有一个经过修改的版本,适用于所有这些不同的YouTube版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// Just the regex. Output is in [1].
/^.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]*).*/

// For testing.
var urls = [
    '//www.youtube-nocookie.com/embed/up_lNV-yoK4?rel=0',
    'http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo',
    'http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel',
    'http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub',
    'http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I',
    'http://www.youtube.com/user/SilkRoadTheatre#p/a/u/2/6dwqZw0j_jY',
    'http://youtu.be/6dwqZw0j_jY',
    'http://www.youtube.com/watch?v=6dwqZw0j_jY&feature=youtu.be',
    'http://youtu.be/afa-5HQHiAs',
    'http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo?rel=0',
    'http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel',
    'http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub',
    'http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I',
    'http://www.youtube.com/embed/nas1rJpm7wY?rel=0',
    'http://www.youtube.com/watch?v=peFZbP64dsU',
    'http://youtube.com/v/dQw4w9WgXcQ?feature=youtube_gdata_player',
    'http://youtube.com/vi/dQw4w9WgXcQ?feature=youtube_gdata_player',
    'http://youtube.com/?v=dQw4w9WgXcQ&feature=youtube_gdata_player',
    'http://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player',
    'http://youtube.com/?vi=dQw4w9WgXcQ&feature=youtube_gdata_player',
    'http://youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player',
    'http://youtube.com/watch?vi=dQw4w9WgXcQ&feature=youtube_gdata_player',
    'http://youtu.be/dQw4w9WgXcQ?feature=youtube_gdata_player'
];

var i, r, rx = /^.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]*).*/;

for (i = 0; i < urls.length; ++i) {
    r = urls[i].match(rx);
    console.log(r[1]);
}


1
/^.*(youtu.be\/|v\/|e\/|u\/\w+\/|embed\/|v=)([^#\&\?]*).*/

测试日期:

  • http://www.youtube.com/v/0zm3napsvmg?fs=1&hl=en_-us&rel=0
  • http://www.youtube.com/embed/0zm3napsvmg?Re= 0
  • http://www.youtube.com/watch?V=0ZM3napsvmg&feature=feedRec_grec_索引
  • http://www.youtube.com/watch?V=0ZM3napsvmg
  • http://youtu.be/0zm3napsvmg
  • http://www.youtube.com/watch?V=0ZM3napsvmg t=0m10s
  • http://www.youtube.com/user/ingridmichaelsonvevo p/a/u/1/kdwsulmb8eq
  • 网址:http://youtu.be/dqw4w9wgxcq
  • http://www.youtube.com/embed/dqw4w9wgxcq
  • http://www.youtube.com/v/dqw4w9wgxcq
  • http://www.youtube.com/e/dqw4w9wgxcq
  • http://www.youtube.com/watch?V=DQW4W9WGXCQ
  • http://www.youtube.com/?V=DQW4W9WGXCQ
  • http://www.youtube.com/watch?功能=播放器嵌入&v=dqw4w9wgxcq
  • http://www.youtube.com/?功能=播放器嵌入&v=dqw4w9wgxcq
  • http://www.youtube.com/user/ingridmichaelsonvevo p/u/11/kdwsulmb8eq
  • http://www.youtube-nocookie.com/v/6l3zvimwzfm?版本=3&hl=en_US&rel=0

受另一个答案的启发。


我创建了一个函数来测试用户输入的YouTube、SoundCloud或Vimeo Embed ID,以便能够使用嵌入式媒体创建更连续的设计。此函数检测并返回具有两个属性的对象:"type"和"id"。类型可以是"youtube"、"vimeo"或"soundcloud","id"属性是唯一的媒体ID。

在这个站点上,我使用一个文本区域转储,用户可以在其中粘贴任何类型的链接或嵌入代码,包括vimeo和youtube的iframe嵌入。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function testUrlForMedia(pastedData) {
var success = false;
var media   = {};
if (pastedData.match('http://(www.)?youtube|youtu\.be')) {
    if (pastedData.match('embed')) { youtube_id = pastedData.split(/embed\//)[1].split('"')[0]; }
    else { youtube_id = pastedData.split(/v\/|v=|youtu\.be\//)[1].split(/[?&]/)[0]; }
    media.type  ="youtube";
    media.id    = youtube_id;
    success = true;
}
else if (pastedData.match('http://(player.)?vimeo\.com')) {
    vimeo_id = pastedData.split(/video\/|http:\/\/vimeo\.com\//)[1].split(/[?&]/)[0];
    media.type  ="vimeo";
    media.id    = vimeo_id;
    success = true;
}
else if (pastedData.match('http://player\.soundcloud\.com')) {
    soundcloud_url = unescape(pastedData.split(/value="/)[1].split(/["]/)[0]);
    soundcloud_id = soundcloud_url.split(/tracks\//)[1].split(/[&"]/)[0];
    media.type  ="soundcloud";
    media.id    = soundcloud_id;
    success = true;
}
if (success) { return media; }
else { alert("No valid media id detected"); }
return false;
}


鉴于YouTube有各种各样的URL样式,我认为Regex是更好的解决方案。这是我的正则表达式:

1
^.*(youtu.be\/|v\/|embed\/|watch\?|youtube.com\/user\/[^#]*#([^\/]*?\/)*)\??v?=?([^#\&\?]*).*

第三组有你的YouTube ID

YouTube URL示例(当前包括"传统嵌入URL样式")-上面的regex适用于所有URL:

1
2
3
4
5
6
7
http://www.youtube.com/v/0zM3nApSvMg?fs=1&amp;hl=en_US&amp;rel=0
http://www.youtube.com/embed/0zM3nApSvMg?rel=0
http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index
http://www.youtube.com/watch?v=0zM3nApSvMg
http://youtu.be/0zM3nApSvMg
http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s
http://www.youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/QdK8U-VIH_o

拉斯诺帽尖


博士

匹配此问题的所有URL示例,然后匹配一些。

1
2
let re = /^(https?:\/\/)?((www\.)?(youtube(-nocookie)?|youtube.googleapis)\.com.*(v\/|v=|vi=|vi\/|e\/|embed\/|user\/.*\/u\/\d+\/)|youtu\.be\/)([_0-9a-z-]+)/i;
let id ="https://www.youtube.com/watch?v=l-gQLqv9f4o".match(re)[7];

ID将始终位于匹配组7中。

我从这个问题的答案中获取的所有URL的实况示例:网址:https://regexr.com/3u0d4

完整解释:

随着许多答案/评论的出现,YouTube视频URL有许多格式。即使是多个TLD,它们看起来都是"托管"的。

您可以通过上面的regexr链接查看我检查的变体的完整列表。

我们来分解regexp。

^将字符串锁定到字符串的开头。(https?:\/\/)?可选协议http://or https://the ?使前面的项目可选,因此s和整个组(括在一组括号内的任何内容)都是可选的。

好的,下一部分是它的肉。基本上,我们有两种选择:www.youtu be.com/…[id]的不同版本和链接缩短了youtu.be/[id]版本。

1
2
3
4
5
6
7
8
9
(                                                  // Start a group which will match everything after the protocol and up to just before the video id.
  (www\.)?                                         // Optional www.
  (youtube(-nocookie)?|youtube.googleapis)         // There are three domains where youtube videos can be accessed. This matches them.
  \.com                                            // The .com at the end of the domain.
  .*                                               // Match anything
  (v\/|v=|vi=|vi\/|e\/|embed\/|user\/.*\/u\/\d+\/) // These are all the things that can come right before the video id. The | character means OR so the first one in the"list" matches.
  |                                                // There is one more domain where you can get to youtube, it's the link shortening url which is just followed by the video id. This OR separates all the stuff in this group and the link shortening url.
  youtu\.be\/                                      // The link shortening domain
)                                                  // End of group

最后,我们让组选择视频ID。至少一个字符是数字、字母、下划线或破折号。

1
([_0-9a-z-]+)

您可以通过在regexr链接上查找并查看表达式的每个部分如何与URL中的文本匹配来了解更多有关regex每个部分的详细信息。


在游戏后期,我将Mantish和J-W的两个出色的反应融合在一起。首先,修改后的regex:

1
const youtube_regex = /^.*(youtu\.be\/|vi?\/|u\/\w\/|embed\/|\?vi?=|\&vi?=)([^#\&\?]*).*/

这是测试代码(我已经将Mantish的原始测试用例添加到了J-W的更低级的测试用例中):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
 var urls = [
      'http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index',
      'http://www.youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/QdK8U-VIH_o',
      'http://www.youtube.com/v/0zM3nApSvMg?fs=1&amp;hl=en_US&amp;rel=0',
      'http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s',
      'http://www.youtube.com/embed/0zM3nApSvMg?rel=0',
      'http://www.youtube.com/watch?v=0zM3nApSvMg',
      'http://youtu.be/0zM3nApSvMg',
      '//www.youtube-nocookie.com/embed/up_lNV-yoK4?rel=0',
      'http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo',
      'http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel',
      'http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub',
      'http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I',
      'http://www.youtube.com/user/SilkRoadTheatre#p/a/u/2/6dwqZw0j_jY',
      'http://youtu.be/6dwqZw0j_jY',
      'http://www.youtube.com/watch?v=6dwqZw0j_jY&feature=youtu.be',
      'http://youtu.be/afa-5HQHiAs',
      'http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo?rel=0',
      'http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel',
      'http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub',
      'http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I',
      'http://www.youtube.com/embed/nas1rJpm7wY?rel=0',
      'http://www.youtube.com/watch?v=peFZbP64dsU',
      'http://youtube.com/v/dQw4w9WgXcQ?feature=youtube_gdata_player',
      'http://youtube.com/vi/dQw4w9WgXcQ?feature=youtube_gdata_player',
      'http://youtube.com/?v=dQw4w9WgXcQ&feature=youtube_gdata_player',
      'http://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player',
      'http://youtube.com/?vi=dQw4w9WgXcQ&feature=youtube_gdata_player',
      'http://youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player',
      'http://youtube.com/watch?vi=dQw4w9WgXcQ&feature=youtube_gdata_player',
      'http://youtu.be/dQw4w9WgXcQ?feature=youtube_gdata_player'
  ];

  var failures = 0;
  urls.forEach(url => {
    const parsed = url.match(youtube_regex);
    if (parsed && parsed[2]) {
      console.log(parsed[2]);
    } else {
      failures++;
      console.error(url, parsed);
    }
  });
  if (failures) {
    console.error(failures, 'failed');
  }

用于处理评论中提到的m.youtube URL的实验版本:

1
const youtube_regex = /^.*((m\.)?youtu\.be\/|vi?\/|u\/\w\/|embed\/|\?vi?=|\&vi?=)([^#\&\?]*).*/

它要求在测试中的两个位置将parsed[2]更改为parsed[3](然后通过添加到测试中的m.youtubeURL)。如果你看到问题请告诉我。


由于youtube视频ID设置为11个字符,我们只需在使用v=拆分URL后使用substring。那么我们就不依赖于最后的和号。

1
2
3
var sampleUrl ="http://www.youtube.com/watch?v=JcjoGn6FLwI&asdasd";

var video_id = sampleUrl.split("v=")[1].substring(0, 11)

又好又简单:)


我发现(从2019年起)最好的解决方案是:

1
2
3
4
function YouTubeGetID(url){
   url = url.split(/(vi\/|v=|\/v\/|youtu\.be\/|\/embed\/)/);
   return (url[2] !== undefined) ? url[2].split(/[^0-9a-z_\-]/i)[0] : url[0];
}

我在这里找到的。

1
2
3
4
5
6
7
8
9
10
11
12
13
/*
* Tested URLs:
var url = 'http://youtube.googleapis.com/v/4e_kz79tjb8?version=3';
url = 'https://www.youtube.com/watch?feature=g-vrec&v=Y1xs_xPb46M';
url = 'http://www.youtube.com/watch?feature=player_embedded&v=Ab25nviakcw#';
url = 'http://youtu.be/Ab25nviakcw';
url = 'http://www.youtube.com/watch?v=Ab25nviakcw';
url = '<iframe width="420" height="315" src="http://www.youtube.com/embed/Ab25nviakcw" frameborder="0" allowfullscreen></iframe>';
url = '<object width="420" height="315"><param name="movie" value="http://www.youtube-nocookie.com/v/Ab25nviakcw?version=3&amp;hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param></embed></object>';
url = 'http://i1.ytimg.com/vi/Ab25nviakcw/default.jpg';
url = 'https://www.youtube.com/watch?v=BGL22PTIOAM&feature=g-all-xit';
url = 'BGL22PTIOAM';
*/

Java代码:(为所有URL工作:

  • http://www.youtube.com/watch?V=0ZM3napsvmg&feature=feedRec_grec_索引
  • http://www.youtube.com/user/ingridmichaelsonvevo p/a/u/1/qdk8u-vih_o
  • http://youtube.googleapis.com/v/0zm3napsvmg?fs=1&hl=en_-us&rel=0
  • http://www.youtube.com/watch?V=0ZM3napsvmg t=0m10s
  • http://www.youtube.com/embed/0zm3napsvmg?Re= 0
  • http://www.youtube.com/watch?V=0ZM3napsvmg
  • http://youtu.be/0zm3napsvmg
  • http://www.youtube.com/watch?V=0ZM3napsvmg/
  • http://www.youtube.com/watch?功能=播放器详情页面&v=8uvnt4wvigy
  • )

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        String url ="http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index";

        String regExp ="/.*(?:youtu.be\\/|v\\/|u/\\w/|embed\\/|watch\\?.*&?v=)";
        Pattern compiledPattern = Pattern.compile(regExp);
        Matcher matcher = compiledPattern.matcher(url);
        if(matcher.find()){
            int start = matcher.end();
            System.out.println("ID :" + url.substring(start, start+11));

        }

    日常活动:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    String url ="http://www.dailymotion.com/video/x4xvnz_the-funny-crash-compilation_fun";

        String regExp ="/video/([^_]+)/?";
        Pattern compiledPattern = Pattern.compile(regExp);
        Matcher matcher = compiledPattern.matcher(url);
        if(matcher.find()){
            String match = matcher.group();
            System.out.println("ID :" + match.substring(match.lastIndexOf("/")+1));

        }


    更严格的版本:

    1
    ^https?://(?:www\.)?youtu(?:\.be|be\.com)/(?:\S+/)?(?:[^\s/]*(?:\?|&)vi?=)?([^#?&]+)

    测试日期:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    http://www.youtube.com/user/dreamtheater#p/u/1/oTJRivZTMLs
    https://youtu.be/oTJRivZTMLs?list=PLToa5JuFMsXTNkrLJbRlB--76IAOjRM9b
    http://www.youtube.com/watch?v=oTJRivZTMLs&feature=youtu.be
    https://youtu.be/oTJRivZTMLs
    http://youtu.be/oTJRivZTMLs&feature=channel
    http://www.youtube.com/ytscreeningroom?v=oTJRivZTMLs
    http://www.youtube.com/embed/oTJRivZTMLs?rel=0
    http://youtube.com/v/oTJRivZTMLs&feature=channel
    http://youtube.com/v/oTJRivZTMLs&feature=channel
    http://youtube.com/vi/oTJRivZTMLs&feature=channel
    http://youtube.com/?v=oTJRivZTMLs&feature=channel
    http://youtube.com/?feature=channel&v=oTJRivZTMLs
    http://youtube.com/?vi=oTJRivZTMLs&feature=channel
    http://youtube.com/watch?v=oTJRivZTMLs&feature=channel
    http://youtube.com/watch?vi=oTJRivZTMLs&feature=channel


    我已经总结了所有的建议,下面是这个问题的普遍和简短的答案:

    1
    2
    3
    if(url.match('http://(www.)?youtube|youtu\.be')){
        youtube_id=url.split(/v\/|v=|youtu\.be\//)[1].split(/[?&]/)[0];
    }


    一个稍有变化的版本,从一个螳螂张贴:

    1
    2
    3
    4
    var regExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]{11,11}).*/;
    var match = url.match(regExp);
    if (match) if (match.length >= 2) return match[2];
    // error

    这假设代码总是11个字符。我在actionscript中使用它,不确定JavaScript是否支持11,11。还添加了对&v=的支持…(以防万一)


    再一个:

    1
    var id = url.match(/(^|=|\/)([0-9A-Za-z_-]{11})(\/|&|$|\?|#)/)[2]

    它可以处理这个线程中显示的任何URL。

    当YouTube添加了一些其他11个base64字符的参数时,它将无法工作。在那之前,这是一个简单的方法。


    Chris Nolet Cleaner的lasnv答案示例非常好,但我最近发现,如果你试图在文本中找到你的youtube链接,并在youtube URL后放置一些随机文本,那么regexp比需要的更匹配。改进的Chris Nolet回答:

    1
    /^.*(?:youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=)([^#\&\?]{11,11}).*/


    1
    2
    3
    4
    5
    6
    7
    8
    9
    function parser(url){
        var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\/)|(\?v=|\&v=))([^#\&\?]*).*/;
        var match = url.match(regExp);
        if (match && match[8].length==11){
                alert('OK');
        }else{
                alert('BAD');
        }
    }

    用于测试:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    https://www.youtube.com/embed/vDoO_bNw7fc - attention first symbol ?v? in ?vDoO_bNw7fc?

    http://www.youtube.com/user/dreamtheater#p/u/1/oTJRivZTMLs
    https://youtu.be/oTJRivZTMLs?list=PLToa5JuFMsXTNkrLJbRlB--76IAOjRM9b
    http://www.youtube.com/watch?v=oTJRivZTMLs&feature=youtu.be
    https://youtu.be/oTJRivZTMLs
    http://youtu.be/oTJRivZTMLs&feature=channel
    http://www.youtube.com/ytscreeningroom?v=oTJRivZTMLs
    http://www.youtube.com/embed/oTJRivZTMLs?rel=0
    http://youtube.com/v/oTJRivZTMLs&feature=channel
    http://youtube.com/v/oTJRivZTMLs&feature=channel
    http://youtube.com/vi/oTJRivZTMLs&feature=channel
    http://youtube.com/?v=oTJRivZTMLs&feature=channel
    http://youtube.com/?feature=channel&v=oTJRivZTMLs
    http://youtube.com/?vi=oTJRivZTMLs&feature=channel
    http://youtube.com/watch?v=oTJRivZTMLs&feature=channel
    http://youtube.com/watch?vi=oTJRivZTMLs&feature=channel


    我做了一个很小的函数,从下面可以看到的YouTube URL中提取视频ID。

    1
    2
    3
    4
    5
    6
    7
    8
    var videoId = function(url) {
       var match = url.match(/v=([0-9a-z_-]{1,20})/i);
       return (match ? match['1'] : false);
    };

    console.log(videoId('https://www.youtube.com/watch?v=dQw4w9WgXcQ'));
    console.log(videoId('https://www.youtube.com/watch?t=17s&v=dQw4w9WgXcQ'));
    console.log(videoId('https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=17s'));

    此函数将提取视频ID,即使URL中有多个参数。


    试试这个-

    1
    2
    3
    4
    5
    6
    7
    function getYouTubeIdFromURL($url)
    {
      $pattern = '/(?:youtube.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu.be/)([^"&?/ ]{11})/i';
      preg_match($pattern, $url, $matches);

      return isset($matches[1]) ? $matches[1] : false;
    }


    我喜欢苏里亚的回答。只是一个不起作用的案例…

    1
    String regExp ="/.*(?:youtu.be\\/|v\\/|u/\\w/|embed\\/|watch\\?.*&?v=)";

    不适用于

    1
    youtu.be/i4fjHzCXg6c  and  www.youtu.be/i4fjHzCXg6c

    更新版本:

    1
    String regExp ="/?.*(?:youtu.be\\/|v\\/|u/\\w/|embed\\/|watch\\?.*&?v=)";

    为所有人工作。


    这肯定需要regex:

    复制到Ruby IRB:

    1
    2
    3
    4
    var url ="http://www.youtube.com/watch?v=NLqASIXrVbY"
    var VID_REGEX = /(?:youtube(?:-nocookie)?\.com\/(?:[^\/
    \s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})/
    url.match(VID_REGEX)[1]

    所有测试用例请参见:https://gist.github.com/blairanderson/b264a15a8faaac9c6318


    好吧,使用简单解析的方法是:从第一个=符号之后开始到第一个&符号。

    我认为他们有一个相似的答案:

    使用javascript解析Vimeo ID?


    简单的regex如果你有完整的URL,保持简单。

    1
    2
    results = url.match("v=([a-zA-Z0-9]+)&?")
    videoId = results[1] // watch you need.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var video_url = document.getElementById('youtubediv').value;
            if(video_url!=""){
            ytid(video_url);
            document.getElementById("youtube").setAttribute("src","http://www.youtube.com/embed/"+ytid(video_url));
            }
            function ytid(video_url){
                var video_id = video_url.split('v=')[1];
                var ampersandPosition = video_id.indexOf('&');
                if(ampersandPosition != -1) {
                    video_id = video_id.substring(0, ampersandPosition);
                }
                return video_id;
            }

    我希望能有帮助


    1
    2
    3
    4
    function youtube_parser(url){
        var match = url.match(/^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/);
        return (match&&match[7].length==11)?match[7]:false;
    }

    最短有效


    正如评论中提到的Webstrap:

    It worked if the video start with"v" and it's from youtu.be

    The regex contains a little bug \??v?=? this should just be at the
    watch part, otherwise you would filter a 'v' if the id starts with a
    'v'. so this should do the trick

    /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\??v?=?))([^#\&\?]*).*/


    我对Mantish的regex做了一些细微的更改,以包括J W和Matx答案中的所有测试用例;因为它最初并不适用于所有的测试用例。可能还需要进一步的修改,但据我所知,这至少涵盖了大多数链接:

    /(?:[?&]vi?=|\/embed\/|\/\d\d?\/|\/vi?\/|https?:\/\/(?:www\.)?youtu\.be\/)([^&
    ?#]+)/

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var url = ''; // get it from somewhere

    var youtubeRegExp = /(?:[?&]vi?=|\/embed\/|\/\d\d?\/|\/vi?\/|https?:\/\/(?:www\.)?youtu\.be\/)([^&
    ?#]+)/;
    var match = url.match( youtubeRegExp );

    if( match && match[ 1 ].length == 11 ) {
        url = match[ 1 ];
    } else {
        // error
    }

    进一步测试:

    http://regexr.com/3fp84


    在C中,它看起来如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public static string GetYouTubeId(string url) {
        var regex = @"(?:youtube\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?|watch)\/|.*[?&amp;]v=)|youtu\.be\/)([^""&amp;?\/ ]{11})";

        var match = Regex.Match(url, regex);

        if (match.Success)
        {
            return match.Groups[1].Value;
        }

        return url;
      }

    请随意修改。


    您可以使用以下代码从URL获取YouTube视频ID:

    1
    2
    3
    4
    url ="https://www.youtube.com/watch?v=qeMFqkcPYcg"
    VID_REGEX = /(?:youtube(?:-nocookie)?\.com\/(?:[^\/
    \s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})/
    alert(url.match(VID_REGEX)[1]);


    我们认识这些人物?v="cannot be appear more than one but‘v’can be appear more in the id itself so we use"?v="作为分隔符。看它在这里工作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //Get YouTube video Id From Its Url

         $('button').bind('click',function(){
    var
    url='http://www.youtube.com/watch?v=u8nQa1cJyX8',
    videoId = url.split('?v='),//Split data to two
    YouTubeVideoId=videoId[1];
    alert(YouTubeVideoId);return false;

    });

    <button>Click ToGet VideoId</button>


    1
    videoId = videoUrl.split('v=')[1].substring(0,11);