【问题标题】:How do I get the YouTube video ID from a URL?如何从 URL 获取 YouTube 视频 ID?
【发布时间】: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

【问题讨论】:

标签: javascript regex url youtube


【解决方案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})?(?:w{3}\.)?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 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';
*/

【讨论】:

  • 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:

    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=en_US&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));
    
        }
    

    【讨论】:

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

        【讨论】:

        【解决方案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>
                            

                            【讨论】:

                              猜你喜欢
                              • 2012-05-22
                              • 2019-12-07
                              • 1970-01-01
                              • 2011-05-02
                              • 2014-11-01
                              • 2011-07-22
                              • 2011-11-05
                              • 2017-08-17
                              相关资源
                              最近更新 更多