如何从 URL 获取 YouTube 视频 ID?

Posted

技术标签:

【中文标题】如何从 URL 获取 YouTube 视频 ID?【英文标题】:How do I get the YouTube video ID from a URL? 【发布时间】:2011-03-28 00:33:12 【问题描述】:

我想使用 javascript(没有 jQuery,纯 JavaScript)从 YouTube 的 URL 获取 v=id

YouTube URL 格式示例

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

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

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

这些格式的结果

u8nQa1cJyX8

【问题讨论】:

Extract parameter value from url using regular expressions 的可能重复项 这个问题只针对像我的第二个这样的格式。但我在那里找到了一个有趣的答案,谢谢分享。 有一个正则表达式:http://pregcopy.com/exp/27 对此我不以为然,但我发现这非常广泛:gist.github.com/FinalAngel/1876898。它甚至可以捕捉到 youtube.com/watch?feature=player_embedded&v=1p3vcRhsYGo 和 youtube.com/v/1p3vcRhsYGo 等不同的网址 截至 2015 年: 跳至 this answer。其他答案已过时。 【参考方案1】:

我对“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找到

【讨论】:

正则表达式包含一个小错误 \??v?=?这应该只是在手表部分,否则如果 id 以“v”开头,您将过滤“v”。所以这应该可以解决问题 /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\??v? =?))([^#\&\?]*).*/ 更干净:/.*(?:youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=)([^#\&amp;\?]*).*/ 然后使用match[1] 而不是match[7](这对我来说似乎有点武断)。还修复了 WebDev 指出的错误。 你意识到这个正则表达式实际上并没有检查域;它是如此宽松,以至于字符串“v/2g5jg1Q2e6k”足以匹配它。 YouTube ID 需要多长时间才能达到 12 个字符的长度? 任何人都可以扩展这个 reqex,因此人们抱怨没有任何意义。【参考方案2】:

我稍微简化了 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

【讨论】:

请注意:仅当您知道自己正在处理 youtube url 时才应使用此选项。我(错误地)使用它来验证网址为 youtube,这会导致误报,例如这通过了:'v/2059-9080-5437' 我现在正在使用一个不同的正则表达式,它也检查一个 youtube 域。我不确定是否应该更新答案,因为这是一个很大的变化: /^.*(youtu.be\/|youtube(-nocookie)?.com\/(v\/|.*u\/\w \/|嵌入\/|.*v=))([\w-]11).*/ YouTube 何时将视频 ID 改为 12 个字符? “youtu.be”中的点不应该转义吗? 你是对的@jitbit 谢谢。尽管它通常也能正常工作而无需转义。【参考方案3】:

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

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('&'); if (ampersandPosition != -1) video_id = video_id.substring(0, &ampersandPosition); 警报(video_id);返回video_id; ​ 不处理嵌入的 URL 也不处理“共享”生成的 url-https://youtu.be/video_id 此正则表达式适用于 youtube 分享和观看网址。 url='https://youtu.be/video_id'; url.match(/(?:https?:\/2)?(?:w3\.)?youtu(?:be)?\.(?:com|be)(?:\/watch\?v=|\/)([^\s&amp;]+)/); 【参考方案4】:

截至 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]);

【讨论】:

值得注意的是,上面的许多解决方案都没有涵盖这么多有效的url,测试脚本非常有帮助,+1! 请注意,这会被诸如“www.engadget.com/watch?v=dQw4w9WgXcQ”之类的东西所欺骗,但这并不是一个问题 它可以工作,但无法解决问题,该问题会出现带有多个 youtube url 的文本,请参阅此 regex101.com/r/qK5qJ5/1。它不应该替换第二个 url。 如果您不希望空 ID 匹配^.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&amp;v(?:i)?=))([^#\&amp;\?]+).*(即youtube.com/watch?v= 将不匹配) 您所说的“这些都不适用于厨房水槽”是什么意思?【参考方案5】:
/^.*(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?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=en_US&rel=0

灵感来自this other answer。

【讨论】:

^.*(?:youtu.be\/|v\/|e\/|u\/\w+\/|embed\/|v=)([^#\&\ ?]*).* 将为您提供第 1 组的结果【参考方案6】:

我发现的最佳解决方案(从 2019 年到 2021 年)是:

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

我找到了here。

/*
* 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   src="http://www.youtube.com/embed/Ab25nviakcw" frameborder="0" allowfullscreen></iframe>';
url = '<object  ><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"   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';
*/

【讨论】:

TypeScript: const youTubeGetID = (url: string) => const [a, , b] = url .replace(/(>| v=nfDGK_WSFro 失败【参考方案7】:

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

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

第 3 组有您的 YouTube ID

YouTube URL 示例(目前,包括“旧版嵌入 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 致敬

【讨论】:

你真的需要用这个回到绘图板上。是的,它正确匹配上述 URL。但它也会错误地匹配许多其他非 youtube-url 字符串,例如:"domain.com/embed/file.txt""/tv/""Has anyone seen my watch?"。请参阅:my answer 到类似问题以获得更精确的解决方案。 我明白你的意思:上面的正则表达式无法回答“这是 YouTube 网址吗?”的问题。但这不是我的目标。我有 YouTube 网址 - 我只是在提取一个 ID。是的,你的答案是可靠的(并且涵盖了我没有的用例)。 你有我上面提到的同样的错误,ID以'v'开头 感谢 @WebDev - 你知道 YouTube 是否曾在 ID 中加入 v(或以“v”开头的 ID)吗? 直到今天 (2013-01-25) 仍然有效。下面是它的一个例子:jsfiddle.net/bcmoney/yBP4J【参考方案8】:

我创建了一个函数来测试用户输入的 Youtube、Soundcloud 或 Vimeo 嵌入 ID,以便能够使用嵌入式媒体创建更连续的设计。此函数检测并返回一个具有两个属性的对象:“type”和“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 网站上不匹配。【参考方案9】:

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

完整解释:

正如许多答案/cmets 提出的那样,youtube 视频 URL 有多种格式。甚至可以显示为“托管”的多个 TLD。

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

让我们分解正则表达式。

^ 将字符串锁定到字符串的开头。 (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 中的文本匹配来了解有关正则表达式每个部分的更多详细信息。

【讨论】:

在开头将 /^ 更改为 /^.* 以使该解决方案即使在前导空格或其他垃圾的情况下也能正常工作。 好主意。我刚刚更新了正则表达式以完全删除 ^,这不是必需的。我也更新了正则表达式示例。谢谢@AlexanderD'Attore【参考方案10】:

这里的比赛迟到了,但我已经混合了来自 mantish 和 j-w 的两个出色的回应。一、修改后的正则表达式:

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

这是测试代码(我已将 mantish 的原始测试用例添加到 j-w 更糟糕的测试用例中):

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

处理 cmets 中提到的 m.youtube url 的实验版本:

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

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

【讨论】:

你应该在你的测试服中添加这个,因为它有问题并且你的正则表达式为我解决了它:youtu.be/ve4f400859I。字母 v 在我之前的正则表达式中被删除了 如果我添加/,我会得到http://youtu.be/ 的假阳性,它会将其标记为有效。在(value) =&gt; /^.*(youtu\.be\/|vi?\/|u\/\w\/|embed\/|\?vi?=|\&amp;vi?=)([^#\&amp;\?]*).*/.test(value) 中使用它 感谢 cmets。我还没有更新我的示例(没有时间测试)所以任何使用我的代码的人请注意:-) 类型为 m.youtube.com 的 url 怎么样 @MehulThakkar 它们在其他方面类似于 youtube.com 网址吗?【参考方案11】:

此正则表达式匹配嵌入、共享和链接 URL。

const youTubeIdFromLink = (url) => url.match(/(?:https?:\/\/)?(?:www\.|m\.)?youtu(?:be)?\.(?:com|be)(?:\/watch\/?\?v=|\/embed\/|\/)([^\s&\?\/\#]+)/)[1];


console.log(youTubeIdFromLink('https://youtu.be/You-Tube_ID?rel=0&hl=en')); //You-Tube_ID

console.log(youTubeIdFromLink('https://www.youtube.com/embed/You-Tube_ID?rel=0&hl=en')); //You-Tube_ID

console.log(youTubeIdFromLink('https://m.youtube.com/watch?v=You-Tube_ID&rel=0&hl=en')); //You-Tube_ID

【讨论】:

谢谢。最后我稍微改了一下:regex101.com/r/bTrei2/1 @MrMartiniMo 感谢您的提醒,但您链接中的正则表达式仍然与包含连字符 (-) 的 YouTube ID 不匹配。示例:youtube.com/watch?v=06w3-l1AzFk。我已更新我的答案以匹配包含除 url 分隔符之外的任何字符的 YouTube ID。【参考方案12】:

由于 YouTube 视频 ID 设置为 11 characters,因此我们可以在将 URL 与 v= 拆分后直接使用 substring。 那么我们就不再依赖于结尾的 & 了。

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

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

又好又简单:)

【讨论】:

这个实际上是已接受答案的副本【参考方案13】:

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

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

【讨论】:

【参考方案14】:

Java 代码:(适用于所有 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://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?rel=0" http://www.youtube.com/watch?v=0zM3nApSvMg http://youtu.be/0zM3nApSvMg http://www.youtube.com/watch?v=0zM3nApSvMg/ 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));

    

【讨论】:

删除 JavaScript 代码中正则表达式模式周围的双引号,它应该可以工作。【参考方案15】:

稍微严格的版本:

^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

【讨论】:

【参考方案16】:

您可以使用以下代码从 URL 获取 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 个共享选项。地址栏的 url,共享按钮的 url 和内联共享按钮的 url。谢谢!!!【参考方案17】:

这可以从任何类型的 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]);

【讨论】:

【参考方案18】:

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

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

【讨论】:

这是唯一适用于我正在测试的网址的网址:youtube.com/watch?feature=player_embedded&v=0zM3nApSvMg 完美。谢谢@Josha 69 链接组合,我测试所有对我有用。【参考方案19】:

这肯定需要正则表达式:

复制到 Ruby IRB:

var url = "http://www.youtube.com/watch?v=NLqASIXrVbY"
var VID_REGEX = /(?:youtube(?:-nocookie)?\.com\/(?:[^\/\n\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

【讨论】:

【参考方案20】:

还有一个:

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

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

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

【讨论】:

【参考方案21】:

我做了一个小函数来从 Youtube url 中提取视频 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'));

即使url中有多个参数,该函数也会提取视频id。

【讨论】:

【参考方案22】:

如果有人需要 Kotlin 中的完美功能来节省时间。只是希望这会有所帮助

fun extractYTId(ytUrl: String?): String? 
    var vId: String? = null
    val pattern = Pattern.compile(
        "^https?://.*(?:youtu.be/|v/|u/\\w/|embed/|watch?v=)([^#&?]*).*$",
        Pattern.CASE_INSENSITIVE
    )
    val matcher = pattern.matcher(ytUrl)
    if (matcher.matches()) 
        vId = matcher.group(1)
    
    return vId

【讨论】:

【参考方案23】:

这是一个红宝石版本:

def youtube_id(url)
   # Handles various YouTube URLs (youtube.com, youtube-nocookie.com, youtu.be), as well as embed links and urls with various parameters
   regex = /(?:youtube(?:-nocookie)?\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|vi|e(?:mbed)?)\/|\S*?[?&]v=|\S*?[?&]vi=)|youtu\.be\/)([a-zA-Z0-9_-]11)/
   match = regex.match(url)
   if match && !match[1].nil?
      match[1]
   else
      nil
   end
end

测试方法:

example_urls = [
   'www.youtube-nocookie.com/embed/dQw4-9W_XcQ?rel=0',
   'http://www.youtube.com/user/Scobleizer#p/u/1/dQw4-9W_XcQ',
   'http://www.youtube.com/watch?v=dQw4-9W_XcQ&feature=channel',
   'http://www.youtube.com/watch?v=dQw4-9W_XcQ&playnext_from=TL&videos=osPknwzXEas&feature=sub',
   'http://www.youtube.com/ytscreeningroom?v=dQw4-9W_XcQ',
   'http://www.youtube.com/user/SilkRoadTheatre#p/a/u/2/dQw4-9W_XcQ',
   'http://youtu.be/dQw4-9W_XcQ',
   'http://www.youtube.com/watch?v=dQw4-9W_XcQ&feature=youtu.be',
   'http://youtu.be/dQw4-9W_XcQ',
   'http://www.youtube.com/user/Scobleizer#p/u/1/dQw4-9W_XcQ?rel=0',
   'http://www.youtube.com/watch?v=dQw4-9W_XcQ&playnext_from=TL&videos=dQw4-9W_XcQ&feature=sub',
   'http://www.youtube.com/ytscreeningroom?v=dQw4-9W_XcQ',
   'http://www.youtube.com/embed/dQw4-9W_XcQ?rel=0',
   'http://www.youtube.com/watch?v=dQw4-9W_XcQ',
   'http://youtube.com/v/dQw4-9W_XcQ?feature=youtube_gdata_player',
   'http://youtube.com/vi/dQw4-9W_XcQ?feature=youtube_gdata_player',
   'http://youtube.com/?v=dQw4-9W_XcQ&feature=youtube_gdata_player',
   'http://www.youtube.com/watch?v=dQw4-9W_XcQ&feature=youtube_gdata_player',
   'http://youtube.com/?vi=dQw4-9W_XcQ&feature=youtube_gdata_player',
   'http://youtube.com/watch?v=dQw4-9W_XcQ&feature=youtube_gdata_player',
   'http://youtube.com/watch?vi=dQw4-9W_XcQ&feature=youtube_gdata_player',
   'http://youtu.be/dQw4-9W_XcQ?feature=youtube_gdata_player'
]

# Test each one
example_urls.each do |url|
   raise 'Test failed!' unless youtube_id(url) == 'dQw4-9W_XcQ'
end

要查看此代码并在在线 repl 中运行测试,您还可以访问此处: https://repl.it/@TomChapin/youtubeid

【讨论】:

【参考方案24】:

我喜欢 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=)";

适用于所有人。

【讨论】:

【参考方案25】:

试试这个 -

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;

【讨论】:

【参考方案26】:

Chris Nolet 更清洁的 Lasnv 答案示例非常好,但我最近发现,如果您尝试在文本中找到您的 youtube 链接并在 youtube url 之后放置一些随机文本,则正则表达式匹配的方式超出了需要。改进的 Chris Nolet 答案:

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

【讨论】:

【参考方案27】:
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

【讨论】:

【参考方案28】:

我为此写了一个函数:

function getYoutubeUrlId (url) 
    const urlObject = new URL(url);
    let urlOrigin = urlObject.origin;
    let urlPath = urlObject.pathname;

    if (urlOrigin.search('youtu.be') > -1) 
        return urlPath.substr(1);
    

    if (urlPath.search('embed') > -1) 
        // Örneğin "/embed/wCCSEol8oSc" ise "wCCSEol8oSc" return eder.
        return urlPath.substr(7);
    

   
    return urlObject.searchParams.get('v');
,

https://gist.github.com/semihkeskindev/8a4339c27203c5fabaf2824308c7868f

【讨论】:

【参考方案29】:

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

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

Parsing a Vimeo ID using JavaScript?

【讨论】:

如果网址不包含&amp;怎么办? 那么你必须找到什么是等效的分隔符。例如,您给我们的第一个 URL 是 & 符号。在第二个 URL 上,字符串的结尾是分隔符。【参考方案30】:

我们知道这些字符 "?v=" 永远不会出现多个,但 'v' 可以以某种方式出现在 Id 本身中,因此我们使用 "?v=" 作为分隔符。看到它Working Here

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

【讨论】:

以上是关于如何从 URL 获取 YouTube 视频 ID?的主要内容,如果未能解决你的问题,请参考以下文章

如何从频道 ID 获取 YouTube 视频 URL

使用 PHP 从 URL 获取 YouTube 视频 ID

我需要一些帮助来纠正我在 php 中的代码 - 如何从 YouTube URL 获取视频 ID [重复]

如何使用 Java 中的正则表达式从 YouTube URL 获取视频 ID

如何从 Youtube 频道获取所有视频 ID

使用 jQuery 从 URL 获取 YouTube 视频 ID