使用或不使用RegEx提取YouTube ID

请告诉我如何在不进行正则表达的情况下获取youtube ID?

使用以下URL方法, 无法正常工作

http://www.youtube.com/e/dQw4w9WgXcQ

public static String extractYTId(String youtubeUrl) { String video_id = ""; try { if(youtubeUrl != null && youtubeUrl.trim().length() > 0 && youtubeUrl.startsWith("http")) { String expression = "^.*((youtu.be" + "\\/)" + "|(v\\/)|(\\/u\\/w\\/)|(embed\\/)|(watch\\?))\\??v?=?([^#\\&\\?]*).*"; // var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/; //String expression = "^.*(?:youtu.be\\/|v\\/|e\\/|u\\/\\w+\\/|embed\\/|v=)([^#\\&\\?]*).*"; CharSequence input = youtubeUrl; Pattern pattern = Pattern.compile(expression, Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(input); if(matcher.matches()) { String groupIndex1 = matcher.group(7); if(groupIndex1 != null && groupIndex1.length() == 11) video_id = groupIndex1; } } } catch(Exception e) { Log.e("YoutubeActivity", "extractYTId " + e.getMessage()); } return video_id; } 

其他链接工作正常

https://youtube.com/watch?v=0zM3nApSvMg%3Ffs%3D1%26hl%3Den_US%26rel%3D0

https://youtube.com/watch?v=0zM3nApSvMg%3Frel%3D0

http://www.youtube-nocookie.com/v/6L3ZvIMwZFM?version=3&hl=en_US&rel=0

您可以使用以下RegEx

^(?:(?:https?:\/\/)?(?:www\.)?)?(youtube(?:-nocookie)?\.com|youtu\.be)\/.*?(?:embed|e|v|watch\?.*?v=)?\/?([a-z0-9]+)

RegEx分手:

  1. ^ :线锚的开始
  2. (?:(?:https?:\/\/)?(?:www\.)?)?
    • (?:https?:\/\/)? :匹配http://https://可选
    • (?:www\.)?)? :匹配www. 零或一次
  3. (youtube(?:-nocookie)?\.com|youtu\.be)\/ :匹配
    • youtube.comyoutube-nocookie.comyoutu.be后跟/
  4. .*? :懒惰的比赛。 匹配直到下一个模式满足。
  5. (?:embed|e|v|watch\?.*?v=)?\/?
    • (?:embed|e|v|watch\?.*?v=)? :匹配embedev或来自watch?v=或没有
    • \/? :匹配/零或一次
  6. ([a-z0-9]+) :匹配一个或多个字母数字字符并在捕获的组中添加。

使用JavaScript进行现场演示

 var regex = /^(?:(?:https?:\/\/)?(?:www\.)?)?(youtube(?:-nocookie)?\.com|youtu\.be)\/.*?(?:embed|e|v|watch\?.*?v=)?\/?([a-z0-9]+)/i; // An array of all the youtube URLs var youtubeLinks = [ 'http://www.youtube.com/e/dQw4w9WgXcQ', 'http://www.youtube.com/watch?feature=player_embedded&v=dQw4w9WgXcQ', '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://youtu.be/dQw4w9WgXcQ', 'http://www.youtube.com/embed/dQw4w9WgXcQ', 'http://www.youtube.com/v/dQw4w9WgXcQ', 'http://www.youtube.com/watch?v=dQw4w9WgXcQ', 'http://www.youtube-nocookie.com/v/6L3ZvIMwZFM?version=3&hl=en_US&rel=0' ]; // An object to store the results var youtubeIds = {}; // Iterate over the youtube URLs youtubeLinks.forEach(function(url) { // Get the value of second captured group to extract youtube ID var id = "" + (url.match(regex) || [0, 0, 'No ID present'])[2] + ""; // Add the URL and the extracted ID in the result object youtubeIds[url] = id; }); // Log the object in the browser console console.log(youtubeIds); // To show the result on the page document.getElementById('output').innerHTML = JSON.stringify(youtubeIds, 0, 4); 
 .youtubeId { color: green; font-weight: bold; } 
 

你的正则表达式是为youtu.be域设计的,当然它不适用于youtube.com。

  1. 从您的URL字符串构造java.net.URL( https://docs.oracle.com/javase/7/docs/api/java/net/URL.html
  2. 使用URL#getQuery()来获取查询部分
  3. 检查将URI字符串解析为名称 – 值集合 ,以获取将查询部分解码为名称 – 值映射的方法,并获取名称“v”的值
  4. 如果没有“查询”部分(例如http://www.youtube.com/e/dQw4w9WgXcQ ),请使用URL#getPath()(它将为您提供/e/dQw4w9WgXcQ )并/e/dQw4w9WgXcQ解析您的videoID例如,通过跳过前3个符号:url.getPath()。substring(3)

更新。 为什么不正则表达式? 因为标准的JDK URL解析器更加健壮。 它正在由整个Java社区进行测试,而基于RegExp的重新发明的轮子仅通过您自己的代码进行测试。

我喜欢将此function用于所有YouTubevideoID。 我通过url并只返回ID。 检查下面的小提琴。

  var ytSrc = function( url ){ var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/; var match = url.match(regExp); if (match&&match[7].length==11){ return match[7]; }else{ alert("Url incorrecta"); } } 

https://jsfiddle.net/keinchy/tL4thwd7/1/