【问题标题】:Java YouTube regex get video ID and timestampJava YouTube 正则表达式获取视频 ID 和时间戳
【发布时间】:2018-07-08 15:35:33
【问题描述】:

我正在使用以下函数从 YouTube 网址获取视频 ID。

static String getVideoIdFromUrl(String url) {
    String regex = "http(?:s)?://(?:www\\.)?youtu(?:\\.be/|be\\.com/(?:watch\\?v=|v/\u200C\u200B|embed/|user/(?:[\\w#\u200C\u200B]+/)+))([^&#?\\n]+)";
    String id = null;
    Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher(url);
    if (matcher.matches()) {
        id = matcher.group(1);
    }

    return id;
}

这适用于获取几乎所有格式的视频 ID。但是,当提供带有时间戳的 URL 时,它会返回 null。

http://www.youtube.com/watch?v=0zM4nApSvMg#t=0m10s
https://www.youtube.com/watch?v=Br5xdYVbcWw&t=50

如何编写一个同时返回视频 ID 和时间戳的函数?

【问题讨论】:

  • 也许v=([^#&]+) ?我不是 Java 的人,但我很确定有一个函数可以将 url 字符串分成各自的部分。
  • 也不完全确定,但我认为您需要一个围绕 tlds 的小组:(?:\.be/|be\.com/)

标签: java regex youtube youtube-api


【解决方案1】:

您不能在 java 中返回多个变量,但是您可以将 idtime 加载到 HashMap 中并返回它。它可能类似于以下内容:

static Map<String,String> getVideoIdFromUrl(String url) {

  // PATTERN
  String regex = "v=([^#&\n\r]+)|t=([^#&\n\r]+)";

  // INIT RETURN DATA
  String id = "";
  String time = "";

  // RUN REGEX
  Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
  Matcher matcher = pattern.matcher(url);

  // CHECK 
  while (matcher.find()) {

      // SET ID
      if(matcher.group(1) != null)
          id = matcher.group(1);

      // SET TIME
      if(matcher.group(2) != null)
          time = matcher.group(2);

  }

  // BUILD RETURN DATA
  Map<String,String> returnData = new HashMap<String, String>();
  returnData.put("id", id);
  returnData.put("time", time);

  // RETURN
  return returnData;

}

我用以下输出运行了这个函数:

// RUN FUNCTION
Map<String,String> returnMap = myObject.getVideoIdFromUrl("http://www.youtube.com/watch?v=0zM4nApSvMg#t=0m10s");

// PRINT OUTPUT
System.out.println(returnMap);

// PRINTS:
// {id=0zM4nApSvMg, time=0m10s}

【讨论】:

  • 您提供的正则表达式模式不适用于任何 YouTube 网址。 this thread 中有一些不同的,但我正在寻找的是返回带有 matcher.group(2) 的时间戳的东西。
  • @Fragmental 该函数应该返回视频 ID 和时间参数。查询不使用哪些 URL,您希望它返回什么?
  • 它现在运行良好,您已经对其进行了更新。谢谢!
【解决方案2】:
String urlid="" ;
String  url="http://www.youtube.com/watch?v=0zM4nApSvMg#t=0m10s";
Pattern pattern = Pattern.compile("(?:http|https|)(?::\\/\\/|)(?:www.|)(?:youtu\\.be\\/|youtube\\.com(?:\\/embed\\/|\\/v\\/|\\/watch\\?v=|\\/ytscreeningroom\\?v=|\\/feeds\\/api\\/videos\\/|\\/user\\\\S*[^\\w\\-\\s]|\\S*[^\\w\\-\\s]))([\\w\\-\\_]{11})[a-z0-9;:@#?&%=+\\/\\$_.-]*");
    Matcher result = pattern.matcher(url);
    if (result.find())
    {
         urlid=result.group(1);

    }

这匹配几乎所有的 youtube 网址。

latest short format: http://youtu.be/NLqAF9hrVbY 
iframe: http://www.youtube.com/embed/NLqAF9hrVbY
iframe (secure): https://www.youtube.com/embed/NLqAF9hrVbY
object param: http://www.youtube.com/v/NLqAF9hrVbY?fs=1&hl=en_US
object embed: http://www.youtube.com/v/NLqAF9hrVbY?fs=1&hl=en_US
watch: http://www.youtube.com/watch?v=NLqAF9hrVbY
users: http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo
ytscreeningroom: http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I
any/thing/goes!:http://www.youtube.com/sandalsResorts#p/c/54B8C800269D7C1B/2/PPS-8DMrAn4
any/subdomain/too: http://gdata.youtube.com/feeds/api/videos/NLqAF9hrVbY
more params: http://www.youtube.com/watch?v=spDj54kf-vY&feature=g-vrec
query may have dot: http://www.youtube.com/watch?v=spDj54kf-vY&feature=youtu.be
nocookie domain: http://www.youtube-nocookie.com

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 2014-07-25
    • 2022-10-06
    • 2012-03-22
    • 2011-08-08
    相关资源
    最近更新 更多