I got this code to get the youtube id from the links like www.youtube.com/watch?v=xxxxxxx
URL youtubeURL = new URL(link);
youtubeURL.getQuery();
This will work me and simple
public static String getVideoId(@NonNull String videoUrl) {
String reg = "(?:youtube(?:-nocookie)?\\.com\\/(?:[^\\/\\n\\s]+\\/\\S+\\/|(?:v|e(?:mbed)?)\\/|\\S*?[?&]v=)|youtu\\.be\\/)([a-zA-Z0-9_-]{11})";
Pattern pattern = Pattern.compile(reg, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(videoUrl);
if (matcher.find())
return matcher.group(1);
return null;
}
Without knowing the complete specification for all the possible YouTube URLs, this seems to work for the examples you provided:
//*EDIT* - fixed to hopefully support more recent youtube link styles/formats:
(?<=watch\?v=|/videos/|/embed/|youtu.be/)[^&#?]*
... matches PjDw3azfZWI
from either of these URLS:
http://www.youtube.com/watch?v=PjDw3azfZWI#t=31m08s
http://gdata.youtube.com/feeds/api/videos/PjDw3azfZWI
You would need a little more to get that particular info if you did not know that these were from youtube, though that's a pretty quick check
Keep in mind that if you are trying to use only the result of the getQuery()
method, it will not be possible to extract the result from the http://gdata.youtube.com/feeds/api/videos/PjDw3azfZWI
URL, as this URL does not have a query part to it...
Java Example:
Pattern rex = Pattern.compile("(?<=watch\\?v=|/videos/)[^&#]*");
Matcher m = rex.matcher(link);
String YouTubeVideoID = m.group();
Tried the other ones but failed in my case - adjusted the regex to fit for my urls
String pattern = "(?<=watch\\?v=|/videos/|embed\\/)[^#\\&\\?]*";
Pattern compiledPattern = Pattern.compile(pattern);
Matcher matcher = compiledPattern.matcher(url);
if(matcher.find()){
return matcher.group();
}
This one works for: (you could also implement a security check youtubeid length = 11 )
http://www.youtube.com/embed/Woq5iX9XQhA?html5=1
http://www.youtube.com/watch?v=384IUU43bfQ
http://gdata.youtube.com/feeds/api/videos/xTmi7zzUa-M&whatever
Woq5iX9XQhA
384IUU43bfQ
xTmi7zzUa-M
This doesn't use a regex but should still do the job.
/**
* Returns the video id of a YouTube watch link.
*/
public static String getVideoId(String watchLink)
{
return watchLink.substring(watchLink.length() - 11);
}
This regex would do the trick:
(?<=videos\/|v=)([\w-]+)
This means that we're first looking for video/
or v=
then captures all the following characters that can be in word (letters, digits, and underscores) and hyphens.
Example in java:
public static void main(String[] args) {
String link = "http://gdata.youtube.com/feeds/api/videos/xTmi7zzUa-M&whatever";
String pattern = "(?:videos\\/|v=)([\\w-]+)";
Pattern compiledPattern = Pattern.compile(pattern);
Matcher matcher = compiledPattern.matcher(link);
if(matcher.find()){
System.out.println(matcher.group());
}
}
Output:
xTmi7zzUa-M
That pattern worked for me:
"http(?:s?)://(?:www\.)?youtu(?:be\.com/watch\?v=|\.be/)([\w\-]+)(&(amp;)?[\w\?=]*)?"
source: Regular expression for youtube links