25

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();

basically this will get me the id easily v=xxxxxxxx

but I noticed sometime youtube links will be like this

http://gdata.youtube.com/feeds/api/videos/xxxxxx

I am getting the links from a feed so do I need to build a regex for that or theres a parser to get that for me ?

Peril
  • 1,493
  • 5
  • 22
  • 39
  • You may want to look at [my answer to a very similar question](http://stackoverflow.com/questions/5830387/php-regex-find-all-youtube-video-ids-in-string/5831191#5831191). It extracts the video-id from a variety of YouTube URL formats. – ridgerunner Oct 11 '11 at 19:00
  • @ridgerunner thanks but it misses the gdata links – Peril Oct 11 '11 at 20:42
  • Thanks for pointing that out. I've updatated [my YouTube ID matching expression](http://stackoverflow.com/questions/5830387/php-regex-find-all-youtube-video-ids-in-string/5831191#5831191) so that it now correctly matches your `gdata` subdomain example. – ridgerunner Oct 12 '11 at 14:42

9 Answers9

46

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

Community
  • 1
  • 1
max
  • 716
  • 6
  • 11
7
public static String getYoutubeVideoId(String youtubeUrl)
 {
 String video_id="";
  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?=?([^#\&\?]*).*/;
 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;
 }
 }
 return video_id;
 }
samirprogrammer
  • 332
  • 4
  • 18
6

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
Marcus
  • 11,428
  • 5
  • 44
  • 64
  • this will not get me the id only – Peril Oct 11 '11 at 18:22
  • Using `http://gdata.youtube.com/feeds/api/videos/xxxxxx` as indata I get `xTmi7zzUa-M` as output. Did I misread your question and you were asking for a regex that would allow you to parse both `v=xxxxxxxx` and the other one? – Marcus Oct 11 '11 at 18:26
  • Well actually. That regex works in both cases. What result do you get? – Marcus Oct 11 '11 at 18:29
  • but the regex you wrote will get me the id and other stuff check here http://gskinner.com/RegExr/ – Peril Oct 11 '11 at 18:30
  • It's the '$' at the end that makes it only capture everything beyond .../videos/. It wouldn't work in the first example if there if there were any other parameters on the link (i.e. v=xxxxxxx&other_param=yyyyy...) – Derek Springer Oct 11 '11 at 18:32
  • Salah have a look at my updated answer now. @Derek you're right about that, though that wasn't specified in the question I didn't take that into account. – Marcus Oct 11 '11 at 18:36
  • A lookbehind would be better in certain cases than a non-capturing group. If used instead, the entire match (that is `matcher.group()`) would be the id the asker is looking for, rather than the first capturing group (`matcher.group(1)`) – Code Jockey Oct 11 '11 at 19:36
  • @Jockey you're right about that. I replaced my non capturing group with a positive lookbehind. Ty – Marcus Oct 11 '11 at 19:41
2

That pattern worked for me:

"http(?:s?)://(?:www\.)?youtu(?:be\.com/watch\?v=|\.be/)([\w\-]+)(&(amp;)?[\w\?=‌​]*)?"

source: Regular expression for youtube links

OneCoder
  • 21
  • 1
2

Got a better solution from this link.

Use the following method to get the videoId from the link.

YoutubeHelper.java

import com.google.inject.Singleton; 

import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Singleton 
public class YouTubeHelper { 

    final String youTubeUrlRegEx = "^(https?)?(://)?(www.)?(m.)?((youtube.com)|(youtu.be))/";
    final String[] videoIdRegex = { "\\?vi?=([^&]*)","watch\\?.*v=([^&]*)", "(?:embed|vi?)/([^/?]*)", "^([A-Za-z0-9\\-]*)"};

    public String extractVideoIdFromUrl(String url) {
        String youTubeLinkWithoutProtocolAndDomain = youTubeLinkWithoutProtocolAndDomain(url);

        for(String regex : videoIdRegex) {
            Pattern compiledPattern = Pattern.compile(regex);
            Matcher matcher = compiledPattern.matcher(youTubeLinkWithoutProtocolAndDomain);

            if(matcher.find()){
                return matcher.group(1);
            } 
        } 

        return null; 
    } 

    private String youTubeLinkWithoutProtocolAndDomain(String url) {
        Pattern compiledPattern = Pattern.compile(youTubeUrlRegEx);
        Matcher matcher = compiledPattern.matcher(url);

        if(matcher.find()){
            return url.replace(matcher.group(), "");
        } 
        return url;
    } 
} 

Hope this helps.

Nabeel K
  • 5,181
  • 11
  • 33
  • 64
1

This was worked for me

public static String getYoutubeVideoId(String youtubeUrl) {
    String videoId = "";
    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?=?([^#\&\?]*).*/;
        Pattern pattern = Pattern.compile(expression,Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(youtubeUrl);
        if (matcher.matches()) {
            String groupIndex1 = matcher.group(7);
            if(groupIndex1!=null && groupIndex1.length()==11)
                videoId = groupIndex1;
        }

    }
    return videoId;
}

Source link

Bahu
  • 1,344
  • 2
  • 18
  • 47
1

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();
Code Jockey
  • 6,348
  • 6
  • 27
  • 43
  • @krishan indeed not (that wasn't even a valid URL when this question was asked, to my knowledge...) but if you're interested, this should work for the `youtu.be` as well as `/embed/` links: `(?<=watch\?v=|/videos/|/embed/|youtu.be/)[^?]*` (I'll update my answer) - please let me know if it doesn't, as I made that up just now by hand... – Code Jockey Sep 08 '14 at 18:37
  • i got a solution about this my question http://stackoverflow.com/questions/25718304/how-to-get-youtube-video-id-from-url-with-java/ – Er KK Chopra Sep 09 '14 at 10:49
0

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);
}
BullyWiiPlaza
  • 12,477
  • 7
  • 82
  • 129
0
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;
}
saravanan
  • 1,034
  • 1
  • 14
  • 28