如何从URL获取YouTube视频ID?


256

我想v=id从YouTube的URL中获取JavaScript(没有jQuery,纯JavaScript)。

YouTube URL格式示例

http://www.youtube.com/watch?v=u8nQa1cJyX8&a=GxdCwVVULXctT2lYDEPllDR0LRTutYfW

http://www.youtube.com/watch?v=u8nQa1cJyX8

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

这些格式的结果

u8nQa1cJyX8



这个问题仅适用于我的第二个格式。但是我在那找到了一个有趣的答案,谢谢分享。
亚当

对此有一个正则表达式:http
Exos 2012年

对此一无所获,但是我发现这非常广泛:gist.github.com/FinalAngel/1876898。它甚至捕获了各种网址,例如youtube.com/watch?feature=player_embedded&v=1p3vcRhsYGoyoutube.com/v/1p3vcRhsYGo
Simon

2
截至2015年:跳至此答案。其他答案已过期。
Lenar Hoyt 2015年

Answers:


109

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

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

这是一个有用的函数,可以根据此代码在所需的位置工作。var video_url =' youtube.com/ watch?v= eOrNdBpGMv8 & feature= youtube_gdata '; ytid(video_url); 函数ytid(video_url){var video_id = video_url.split('v =')[1]; var ampersandPosition = video_id.indexOf('&'); 如果(ampersandPosition!= -1){video_id = video_id.substring(0,ampersandPosition); } alert(video_id); 返回video_id; }
吉诺

9
无法处理嵌入式网址
Serge

14
也不会处理“共享”生成的网址https://youtu.be/{{video_id}}
-hamncheez

2
此正则表达式可与youtube共享和观看网址很好地配合使用。 url='https://youtu.be/{{video_id}}'; url.match(/(?:https?:\/{2})?(?:w{3}\.)?youtu(?:be)?\.(?:com|be)(?:\/watch\?v=|\/)([^\s&]+)/);
迪普

410

我对“ jeffreypriebe”提供的Regex进行了增强,因为他需要一种YouTube URL,即通过频道观看视频时的URL。

嗯,不,这就是我已经装备的功能。

<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;
}
</script>

这些是支持的URL类型

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_parsear_URL_de_YouTube


6
正则表达式包含一个小错误\ ?? v?=?这应该只是在手表部分,否则如果id以“ v”开头,则将过滤“ v”。因此,这应该可以解决问题/^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\??v? =?))([[^#\&\?] *)。* /
webstrap 2011年

69
甚至更干净:/.*(?:youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=)([^#\&\?]*).*/ 然后使用match[1]代替match[7](对我来说似乎有点武断)。还修复了WebDev指出的错误。
克里斯·诺莱特

3
YouTube ID长度为12个字符之前需要多长时间?
Lenar Hoyt 2015年

1
您知道吗,如果您放things.com/watch?v=jn40gqhxoSY,它并不是真的很完美。它认为这是一个YouTube网址
Gino

1
任何人都可以扩展此reqex,因此抱怨的人没有任何意义。
Lecha Bisultanov

241

我简化了Lasnv的答案。

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

这里是:

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
}

这是一个正则表达式链接,可用于:http ://regexr.com/3dnqv


2
请注意:仅当您知道要处理youtube网址时,才应使用此选项。我(错误地)用它来验证了YouTube网址,从而导致误报,例如,通过:'v / 2059-9080-5437'–法

3
我现在使用另一个正则表达式来检查youtube域。我不确定是否应该更新答案,因为这是一个很大的变化:/^.*(youtu.be\/|youtube(-nocookie)?.com\/(v\/|.*u\/\w \ / | embed \ / |。* v =))([\ w-] {11})。* /
螳螂2015年

4
YouTube何时将视频ID切换为12个字符?
Lenar Hoyt

不应该将“ youtu.be”中的点转义吗?
Alex

你说得对@jitbit谢谢。尽管它通常在不转义的情况下也能正常工作。
螳螂

85

自2015年1月1日起,这些工具都无法在厨房的水槽上工作,特别是没有协议的http / s和youtube-nocookie域的URL。因此,这是修改后的版本,适用于所有这些各种YouTube版本:

// 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]);
}

2
值得一提的是,上述许多解决方案都无法涵盖如此大量的有效网址,因此测试脚本非常有帮助,+ 1!
2013年

2
请注意,这将被“ www.engadget.com/watch?v=dQw4w9WgXcQ”之类的东西所欺骗,但这并不是一个可能的问题
binaryfunt

它可以工作,但无法解决出现带有多个youtube网址的文本的问题,请参见this regex101.com/r/qK5qJ5/1。它不应替换第二个URL。
Ashish

2
如果您不希望空ID匹配:(^.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]+).*youtube.com/watch?v=将不匹配)
zurfyx

“这些都不在厨房的水槽上工作”是什么意思?
rmutalik

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

经过测试:

  • http://www.youtube.com/v/0zM3nApSvMg?fs=1&hl=zh_CN&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/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?feature=player_embedded&v=dQw4w9WgXcQ
  • http://www.youtube.com/?feature=player_embedded&v=dQw4w9WgXcQ
  • http://www.youtube.com/user/IngridMichaelsonVEVO#p/u/11/KdwsulMb8EQ
  • http://www.youtube-nocookie.com/v/6L3ZvIMwZFM?version=3&hl=zh_CN&rel=0

受到其他答案的启发。


9
^。*(?: youtu.be \ / | v \ / | e \ / | u \ / \ w + \ / | embed \ / | v =)([^#\&\?] *)。*将给出您属于第1组的结果
Marc 2013年

19

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

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

第3组拥有您的YouTube ID

示例YouTube URL(当前包括“旧版嵌入URL样式”)-上面的Regex适用于所有这些URL:

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

前往Lasnv的小费


9
您确实需要回到这个绘图板上。是的,它与上述URL正确匹配。但它也错误地匹配许多其他非YouTube URL字符串,如:"domain.com/embed/file.txt""/tv/""Has anyone seen my watch?"。请参阅:对类似问题的答案,以寻求更精确的解决方案。
ridgerunner

1
我明白你的意思:上面的正则表达式无法回答“这是YouTube URL吗?”的问题。但这不是我的目标。我有YouTube网址-我只是提取一个ID。是的,您的回答很可靠(涵盖了我没有的用例)。
jeffreypriebe 2011年

您有我上面提到的ID以'v'开头的相同错误
webstrap 2011年

感谢@WebDev-您知道YouTube是否曾经在ID中添加av(或以“ v”开头的ID)吗?
jeffreypriebe 2011年

1
截至今天(2013-01-25)仍然有效。这是一个实际的示例:jsfiddle.net/bcmoney/yBP4J
bcmoney 2013年

17

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

在该网站上,我使用了textarea转储,用户可以在其中粘贴任何类型的链接或嵌入代码,包括vimeo和youtube的iFrame嵌入。

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;
}

好主意,但不适用于绝大多数URL格式。包括在任何https网站上都不匹配。
NickG

13

在这里比赛晚了,但我总结了螳螂和jw的两个出色反应。首先,修改后的正则表达式:

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

这是测试代码(我已将mantish的原始测试用例添加到jw的更原始的用例中):

 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网址:

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

需要在测试中的两个位置parsed[2]将其更改parsed[3](然后将其与m.youtube添加到测试中的URL一起传递)。如果您发现问题,请告诉我。


1
您应该在测试服中添加此代码,因为它有问题,并且您的正则表达式为我解决了这个问题:youtu.be/ve4f400859I。在我之前的正则表达式中删除了字母v
Mark Odey,

1
http://youtu.be/如果添加/它将其标记为有效,我将得到错误的肯定。在使用它(value) => /^.*(youtu\.be\/|vi?\/|u\/\w\/|embed\/|\?vi?=|\&vi?=)([^#\&\?]*).*/.test(value)
Anima-t3d 18/09/5

感谢您的评论。我尚未更新示例(没有时间进行测试),所以任何使用我的代码的人都请注意:-)
podperson

网址类型= m.youtube.com的情况如何
Mehul Thakkar,

@MehulThakkar是否与youtube.com网址相似?
播客

11

tl;博士

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

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://或https:// ?使上一项成为可选协议,因此s,然后整个组(括号内的任何内容)都是可选的。

好的,这是下一部分。基本上,我们有两个选择,分别是www.youtube.com/...[id]的各种版本和缩短了youtu.be/[id]版本的链接。

(                                                  // 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。至少一个字符,是数字,字母,下划线或破折号。

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

您可以通过转至regexr链接并查看表达式的各个部分如何与url中的文本匹配,来找到有关regex各个部分的更多详细信息。


10

我发现(从2019-2020)的最佳解决方案是:

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];
}

我在这里找到的。

/*
* 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 src="http://www.youtube-nocookie.com/v/Ab25nviakcw?version=3&amp;hl=en_US" type="application/x-shockwave-flash" width="420" height="315" allowscriptaccess="always" allowfullscreen="true"></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';
*/

类型脚本:const youTubeGetID =(url:字符串)=> {const [a,,b] = url .replace(/(> | <)/ gi,'').split(/(vi \ / | v = | \ /v\/|youtu\.be\/|\/embed\/)/); 如果(b!==未定义){返回b.split(/ [^ 0-9a-z _-] / i)[0]; } else {返回a; };
弗拉德

v = nfDGK_WSFro失败
Deen John

6

由于YouTube视频ID设置为11个字符,因此我们只需substring将URL分割为即可v=。那么我们最后就不必依赖与号了。

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

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

漂亮又简单:)


这实际上是已接受答案的重复
brasofilo

5

我总结了所有建议,这是对此问题的普遍且简短的回答:

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

5

Java代码:(适用于所有URL:

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

    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));

    }

对于DailyMotion:

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
删除JavaScript代码中Regex模式周围的双引号,它应该可以工作。
TheDude

4

稍微严格一点的版本:

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

经过测试:

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

4

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

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

我在所有其他正则表达式示例中都遇到了问题,但是这一示例有效地适用于台式机用户使用的3种共享选项。地址栏中的网址,共享按钮中的网址和嵌入式共享按钮中的网址。谢谢!!!
马丁的

2

与发布的一种螳螂略有不同的版本:

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 = ....的支持(以防万一)


这是我测试过的唯一适用于url的网址:youtube.com/watch?
Dominic

完善。谢谢@Josha 69链接组合我测试的一切都对我有用。
gokhan 2014年


2

多一个:

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

它适用于此线程中显示的任何URL。

当YouTube用11个base64字符添加其他参数时,它将无法正常工作。到那时,这是简单的方法。


2

我做了一个小功能,可以从YouTube网址中提取视频ID,如下所示。

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。


2

这可以从任何类型的youtube链接获取视频ID

var url= 'http://youtu.be/0zM3nApSvMg';
var urlsplit= url.split(/^.*(youtu.be\/|v\/|embed\/|watch\?|youtube.com\/user\/[^#]*#([^\/]*?\/)*)\??v?=?([^#\&\?]*).*/);
console.log(urlsplit[3]);

1

我喜欢Surya的回答。只是在无法解决的情况下...

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

不适用于

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

更新后的版本:

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

适用于所有人。


1

试试这个-

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

克里斯·诺莱特(Chris Nolet)的Lasnv答案的清洁器示例很好,但是我最近发现,如果您尝试在文本中找到您的youtube链接并将一些随机文本放在youtube url之后,则regexp匹配的方式远远超出了需要。改进了Chris Nolet的答案:

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


1
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');
    }
}

用于检测:

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

0

好吧,使用简单解析的方法是:让所有内容从第一个=号开始到第一个号。

我认为他们在这里有一个类似的答案:

使用JavaScript解析Vimeo ID?


2
如果网址不包含该&怎么办?
亚当

然后,您必须找到等效的分隔符。例如,您为我们提供的第一个URL是&符号。在第二个URL上,字符串的结尾是定界符。
karlphillip 2010年

0

我们知道这些字符“?v =”永远不会出现超过一个,但'v'可以在ID本身中以某种方式出现,因此我们使用“?v =”作为分隔符。看到它在这里工作

//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>

0

如果您具有完整的URL,则使用简单的正则表达式,请使其保持简单。

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

0
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;
        }

我希望它可以帮助


0
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;
}

最短,最高效


不正确,与youtube.com/e/dQw4w9WgXcQ失败,因此请取出有效的部分:)
alecellis1985年

0

正如webstrap在评论中提到的:

如果视频以“ v”开头且来自youtu.be

正则表达式包含一个小错误,\??v?=?应该只在手表部分使用,否则,'v'如果id以开头,则将过滤a 'v'。所以这应该可以解决问题

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.