ChatGPT解决这个技术问题 Extra ChatGPT

如何从 URL 获取 YouTube 视频 ID?

我想使用 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

这个问题只适用于像我的第二个这样的格式。但我在那里找到了一个有趣的答案,谢谢分享。
有一个正则表达式:http://pregcopy.com/exp/27
不能因此获得任何荣誉,但我发现这非常广泛:gist.github.com/FinalAngel/1876898。它甚至可以捕获像 youtube.com/watch?feature=player_embedded&v=1p3vcRhsYGoyoutube.com/v/1p3vcRhsYGo 这样不同的 URL
截至 2015 年: 跳至 this answer。其他答案已过时。

И
Илья Зеленько

我对“jeffreypriebe”提供的正则表达式进行了增强,因为他需要一种 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=)([^#\&\?]*).*/ 然后使用 match[1] 而不是 match[7](这对我来说似乎有点武断)。还修复了 WebDev 指出的错误。
你意识到这个正则表达式实际上并没有检查域;它是如此宽容,以至于字符串“v/2g5jg1Q2e6k”足以匹配它。
YouTube ID 需要多长时间才能达到 12 个字符的长度?
任何人都可以扩展此 reqex,因此抱怨的人没有任何意义。
L
LosManos

我稍微简化了 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 谢谢。尽管它通常也可以正常工作而无需逃避它。
J
Jacob Relkin

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

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 &ersandPosition = video_id.indexOf('&'); if (ampersandPosition != -1) { video_id = video_id.substring(0, &ersandPosition); } 警报(video_id);返回video_id; }​
不处理嵌入的 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&]+)/);
S
Sobral

截至 2015 年 1 月 1 日,这些都不能在厨房水槽上运行,尤其是没有协议 http/s 和 youtube-nocookie 域的 URL。所以这是一个适用于所有这些不同 Youtube 版本的修改版本:

// 只是正则表达式。输出在 [1] 中。 /^.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/|shorts\/)|(?:(?:watch) ?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]*).*/ // 用于测试。 var urls = [ 'https://youtube.com/shorts/dQw4w9WgXcQ?feature=share', '//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?featu re=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\/|shorts\/)|( ?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]*).*/; for (i = 0; i < urls.length; ++i) { r = urls[i].match(rx);控制台.log(r[1]); }


值得注意的是,上述许多解决方案都没有涵盖这么多有效的 url,测试脚本非常有帮助,+1!
请注意,这会被“www.engadget.com/watch?v=dQw4w9WgXcQ”之类的东西所愚弄,但这并不是一个问题
它可以工作,但无法解决出现带有多个 youtube url 的文本的问题 See this regex101.com/r/qK5qJ5/1。它不应该替换第二个 url。
如果您不希望空 ID 匹配^.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]+).*(即 youtube.com/watch?v= 将不匹配)
@rmutalik“除了厨房水槽之外的一切”是英文的表达,意思是“可以想象的一切”。在这种情况下,作者引用了“所有可能的 URL”。
C
Community
/^.*(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 组的结果
V
Vlad

我发现的最佳解决方案(从 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';
*/

打字稿: const youTubeGetID = (url: string) => { const [a, , b] = url .replace(/(>|<)/gi, '') .split(/(vi\/|v=|\ /v\/|youtu\.be\/|\/embed\/)/); if (b !== undefined) { return b.split(/[^0-9a-z_-]/i)[0]; } 其他 { 返回一个; } };
v=nfDGK_WSFro 失败
j
jeffreypriebe

鉴于 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是否曾经将 av 放入ID(或以“v”开头的ID)?
直到今天(2013-01-25)仍然有效。下面是它的一个例子:jsfiddle.net/bcmoney/yBP4J
t
tsdorsey

tl;博士。

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

let re = /(https?:\/\/)?(((m|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 将始终在匹配组 8 中。

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

完整解释:

由于提出了许多答案/评论,YouTube 视频 URL 有多种格式。甚至可以显示为“托管”的多个 TLD。

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

让我们分解正则表达式。

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

好的,接下来的部分就是重点。基本上我们有两个选择,[optional-subdomain].youtube.com/...[id] 的各种版本和链接缩短的 youtu.be/[id] 版本。

(                                                  // Start a group which will match everything after the protocol and up to just before the video id.
  ((m|www)\.)?                                     // Optional subdomain, this supports looking for 'm' or '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
这是一个了不起的答案。我也很欣赏您正在测试的 URL 的详细信息和庞大的列表。对于 2021 / 2022 年的答案非常有用:)
一些改进将是允许 m\.youtube\.com(用于移动)和可能的 youtube\...(用于本地顶级域)。此外,现在删除的 ^ 可能对那些想要更严格的 URL 检查的人有用。但无论如何,这个答案很好,谢谢!
感谢@Magnus 的反馈。我已经更新了正则表达式以允许“m”子域。它更完整,但技术上不需要,因为子域是可选的。至于已删除的 ^,我将其留给使用它的人,因为这种要求取决于任务,不在此答案的范围内。
J
Joakim

我创建了一个函数来测试 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 网站上不匹配。
p
podperson

这里的比赛迟到了,但我已经混合了来自 mantish 和 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 添加到测试中)。如果您发现问题,请告诉我。


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

此正则表达式匹配嵌入、共享和链接 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。
M
Mark

由于 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)

很好很简单:)


这个实际上是已接受答案的副本
r
romaninsh

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

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

s
surya

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

稍微严格的版本:

^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

G
Grant Miller

您可以使用以下代码从 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。谢谢!!!
K
Kai - Kazuya Ito

我有一个支持常用网址的正则表达式,其中还包括 YouTube 短裤

正则表达式模式:

(youtu.*be.*)\/(watch\?v=|embed\/|v|shorts|)(.*?((?=[&#?])|$))

Javascript返回方法:

function getId(url) {
  let regex = /(youtu.*be.*)\/(watch\?v=|embed\/|v|shorts|)(.*?((?=[&#?])|$))/gm;
  return regex.exec(url)[3];
}

支持的 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
https://youtube.com/shorts/0dPkkQeRwTI?feature=share
https://youtube.com/shorts/0dPkkQeRwTI

带测试:

https://regex101.com/r/5JhmpW/1


此线程中最简单但最有效的解决方案
S
Stefan

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


J
Josha

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

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 链接组合,我测试了一切都对我有用。
P
Peter Mortensen

这绝对需要正则表达式:

复制到 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


P
Peter Mortensen

多一个:

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

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

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


T
TURTLE

我做了一个小函数来从 Youtube url 中提取视频 id,如下所示。

var videoId = function(url) { var match = url.match(/v=([0-9a-z_-]{1,20})/i);返回(匹配?匹配['1']:假); }; 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。


S
Subhasmith Thapa

如果有人需要 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
}

T
Tom Chapin

这是一个红宝石版本:

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


u
user2200660

我喜欢苏里亚的回答..只是一个不起作用的情况......

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

适用于所有人。


R
Rohit Suthar

试试这个——

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

m
mindaug

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

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


A
Agafonov
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

S
Semih Keskin

我为此写了一个函数:

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


C
Community

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

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

Parsing a Vimeo ID using JavaScript?


如果 URL 不包含 & 怎么办?
然后你必须找到什么是等效的分隔符。例如,您给我们的第一个 URL 是 & 符号。在第二个 URL 上,字符串的结尾是分隔符。