使用或不使用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分手:
-
^
:线锚的开始 -
(?:(?:https?:\/\/)?(?:www\.)?)?
:-
(?:https?:\/\/)?
:匹配http://
或https://
可选 -
(?:www\.)?)?
:匹配www.
零或一次
-
-
(youtube(?:-nocookie)?\.com|youtu\.be)\/
:匹配-
youtube.com
或youtube-nocookie.com
或youtu.be
后跟/
-
-
.*?
:懒惰的比赛。 匹配直到下一个模式满足。 -
(?:embed|e|v|watch\?.*?v=)?\/?
:-
(?:embed|e|v|watch\?.*?v=)?
:匹配embed
或e
或v
或来自watch?
到v=
或没有 -
\/?
:匹配/
零或一次
-
-
([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。
- 从您的URL字符串构造java.net.URL( https://docs.oracle.com/javase/7/docs/api/java/net/URL.html )
- 使用
URL#getQuery()
来获取查询部分 - 检查将URI字符串解析为名称 – 值集合 ,以获取将查询部分解码为名称 – 值映射的方法,并获取名称“v”的值
- 如果没有“查询”部分(例如
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"); } }