如何从url获取youtube视频id

问题描述 投票:0回答:8

我正在尝试检查一个url是否是有效的youtube视频URL并从中获取youtube视频ID,到目前为止我正在使用一个简单的javascript split函数来实现这一点,但是这有一些小缺点,因为youtube有多个网址。

我一直在查看其他 stackoverflow 线程,但是它们都只支持 1 个特定的 URL,这不是我需要的。

我需要与所有这些 URL 匹配的东西:

http(s)://www.youtu.be/videoID

http(s)://www.youtube.com/watch?v=videoID

(以及脚本自动检测是否包含 YouTube 视频的任何其他短 URL)

任何可以由浏览器快速/高效处理的想法都将不胜感激!

javascript jquery youtube
8个回答
54
投票

试试这个:

var url = "...";
var videoid = url.match(/(?:https?:\/{2})?(?:w{3}\.)?youtu(?:be)?\.(?:com|be)(?:\/watch\?v=|\/)([^\s&]+)/);
if(videoid != null) {
   console.log("video id = ",videoid[1]);
} else { 
    console.log("The youtube url is not valid.");
}

参见正则表达式:

/
(?:https?:\/{2})? // Optional protocol, if have, must be http:// or https://
(?:w{3}\.)?      // Optional sub-domain, if have, must be www.
youtu(?:be)?  // The domain. Match 'youtu' and optionally 'be'. 
\.(?:com|be) // the domain-extension must be .com or .be
(?:\/watch\?v=|\/)([^\s&]+) //match the value of 'v' parameter in querystring from 'watch' directory OR after root directory, any non-space value.
/

8
投票

也许你应该看看 Youtube API 并尝试看看是否有办法通过 API 解析 URL 来获取 videoID。

看看这个帖子: Youtube API - 提取视频ID


5
投票

这可能会很快:

var url = 'http://www.youtu.be/543221'; 
         //http://www.youtube.com/watch?v=SNfYz6Yw0W8&feature=g-all-esi would work also
var a = url.split("v=")[1];
a = a != undefined ? a : url.split("youtu.be/")[1];
b = a.split("&")[0];

变量 c 将包含您的 id。快的。正则表达式更好......但更难阅读。我已经修改了我的代码以解决这两个问题。


2
投票

种类太多了:

  • 最新短格式:
    http://youtu.be/NLqAF9hrVbY
  • iframe:
    http://www.youtube.com/embed/NLqAF9hrVbY
  • iframe(安全):
    https://www.youtube.com/embed/NLqAF9hrVbY
  • 对象参数:
    http://www.youtube.com/v/NLqAF9hrVbY?fs=1&hl=en_US
  • 对象嵌入:
    http://www.youtube.com/v/NLqAF9hrVbY?fs=1&hl=en_US
  • 观看:
    http://www.youtube.com/watch?v=NLqAF9hrVbY
  • 用户:
    http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo
  • yt放映室:
    http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I
  • 任何/事情/发生!:
    http://www.youtube.com/sandalsResorts#p/c/54B8C800269D7C1B/2/PPS-8DMrAn4
  • 任何/子域/太:
    http://gdata.youtube.com/feeds/api/videos/NLqAF9hrVbY
  • 更多参数:
    http://www.youtube.com/watch?v=spDj54kf-vY&feature=g-vrec
  • 查询可能有点:
    http://www.youtube.com/watch?v=spDj54kf-vY&feature=youtu.be
    (来源:如何使用正则表达式查找字符串中的所有 YouTube 视频 ID?

最好的方法是限制输入数据。

祝你好运


2
投票

试试这个代码

var url = "...";
var videoid = url.match((?:youtube(?:-nocookie)?\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11}));
if(videoid != null) {
    console.log("video id = ",videoid[1]);
} else { 
    console.log("The youtube url is not valid.");
}

正则表达式来自 YouTube 视频 ID 正则表达式


0
投票

您可以使用 preg_match 轻松完成,这里是示例:

$url = "http://www.youtube.com/watch?v=YzOt12co4nk&feature=g-vrec";
preg_match('/v=([0-9a-zA-Z]+)/', $url, $matches);
$vid = $matches[1];

现在您将拥有视频 ID:$vid = YzOt12co4nk;


0
投票

我找到了一种不使用正则表达式的简单方法。

我做了一个函数可以为你做到这一点:

function getLink(url){
    fetch('www.youtube.com/oembed?url=' + url).then(res => {
     var thumbnailUrl = res.thumbnail_url;
     var id = thumbnail_url.split('vi/')[1].substring(0, 11);
     return id;}
      )
}

console.log(getLink(your_url));
// here replace 'your_url' with your specified youtube url.

它所做的就是,它使用 youtube api 并将您的 url 作为参数传递,并且 youtube 会处理 url 的类型,因此您不必担心它。接下来,该函数从该 api 获取“thumbnail_url”数据,然后相应地分割缩略图的 url 以查找视频的 ID。


0
投票

2024版

Youtube 刚刚将其共享 URL 结构更新为 `https://youtu.be/xxxxxxx?si=xxxxxx

这是更新后的 util 函数

打字稿版本:

export function extractYouTubeVideoId(url: string): string | null {
  const videoID = url.match(
    /(?:https?:\/\/)?(?:www\.)?youtu(?:be)?\.(?:com|be)\/(?:watch\?v=|embed\/|v\/|)([^#&?]+)/
  );
  return videoID ? videoID[1] : null;
}

Javascript版本:

function extractYouTubeVideoId(url) {
    const videoID = url.match(/(?:https?:\/\/)?(?:www\.)?youtu(?:be)?\.(?:com|be)\/(?:watch\?v=|embed\/|v\/|)([^#&?]+)/);
    return videoID ? videoID [1] : null;
}
© www.soinside.com 2019 - 2024. All rights reserved.