C# regex to get video id from youtube and vimeo by url

I’m busy trying to create two regular expressions to filter the id from youtube and vimeo video’s. I’ve already got the following expressions;

YouTube: (youtube.com/)(.*)v=([a-zA-Z0-9-_]+)
Vimeo: vimeo.com/([0-9]+)$

As i explained below there are 2 types of urls matched by the regular expressions i already created. Several other types of urls from Vimeo and YouTube aren’t coverd by the expressions. What i prefer most is that all this can be covered in two expressions. One for all Vimeo video’s and one for all youtube video’s. I’ve been busy experimenting with some different expressions, but no succes so far. I’m still trying to master regular expressions, so i hope i’m on the right way and somebody can help me out! If more information is required, please let me know!

VIMEO URLs NOT MATCHED:

http://vimeo.com/channels/hd#11384488
<p class="responsive-video-wrap clr">
http://vimeo.com/staffpicks#13561592

YOUTUBE URLs NOT MATCHED
http://www.youtube.com/user/username#p/a/u/1/bpJQZm_hkTE
<p class="responsive-video-wrap clr"></p>
<p class="responsive-video-wrap clr"></p>

URLs Matched
http://www.youtube.com/watch?v=bWTyFIYPtYU&feature=popular
http://vimeo.com/834881

The idea is to match all the url’s mentioned above with two regular expressions. One for vimeo and one for youtube.

UPDATE AFTER ANSWER Sedith:

This is how my expressions look now

public static readonly Regex VimeoVideoRegex = new Regex(@"vimeo.com/(?:.*#|.*/videos/)?([0-9]+)", RegexOptions.IgnoreCase | RegexOptions.Multiline);
public static readonly Regex YoutubeVideoRegex = new Regex(@"youtu(?:.be|be.com)/(?:(.*)v(/|=)|(.*/)?)([a-zA-Z0-9-_]+)", RegexOptions.IgnoreCase);

And in code i have
var youtubeMatch = url.match(YoutubeVideoRegex );
var vimeoMatch = url.match(VimeoVideoRegex );

var youtubeIndex = (youtubeMatch.length - 1)
var youtubeId = youtubeMatch[youtubeIndex];

As you can see i now need to find the index where the videoId is in the array with matches returned from the regex. But i want it to only return the id itselfs, so i don’t need to modify the code when youtube of vimeo ever decide to change there urls. Any tips on this?

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

I had a play around with the examples and came up with these:

Youtube: youtu(?:.be|be.com)/(?:.*v(?:/|=)|(?:.*/)?)([a-zA-Z0-9-_]+)
Vimeo: vimeo.com/(?:.*#|.*/videos/)?([0-9]+)

And they should match all those given. The (?: …) means that everything inside the bracket won’t be captured. So only the id should be obtained.

I’m a bit of a regex novice myself, so don’t be surprised if someone else comes in here screaming not to listen to me, but hopefully these will be of help.

I find this website extremely useful in working out the patterns: http://www.regexpal.com/

Edit:

get the id like so:

string url = ""; //url goes here!

Match youtubeMatch = YoutubeVideoRegex.Match(url);
Match vimeoMatch = VimeoVideoRegex.Match(url);

string id = string.Empty;

if (youtubeMatch.Success)
    id = youtubeMatch.Groups[1].Value; 

if (vimeoMatch.Success)
    id = vimeoMatch.Groups[1].Value;

That works in plain old c#.net, can’t vouch for asp.net

Method 2

In case you are writing some application with view model (e.g. ASP.NET MVC):

public string YouTubeUrl { get; set; }

public string YouTubeVideoId
{
    get
    {
        var youtubeMatch =
            new Regex(@"youtu(?:.be|be.com)/(?:.*v(?:/|=)|(?:.*/)?)([a-zA-Z0-9-_]+)")
            .Match(this.YouTubeUrl);
        return youtubeMatch.Success ? youtubeMatch.Groups[1].Value : string.Empty;
    }
}

Method 3

Vimeo:

vimeo.com/(?:.*#|.*/)?([0-9]+)


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x