Regex for YouTube ID

40,143

Solution 1

This is a duplicate question, and has been answered before.

I think you will find the regexp there will also work here.

parse youtube video id using preg_match

EDIT: I noticed that it does not work for the sandalsResort URL you have at the top of your list, so you can modify the regex to the following (converted for use in JS)

var myregexp = /(?:youtube\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/)([^"&?\/\s]{11})/gi;

All I did was to replace user with [^/]+

The ID is still captured in back-reference 1.

Solution 2

I use this regexp: /youtu(?:.*\/v\/|.*v\=|\.be\/)([A-Za-z0-9_\-]{11})/ and it works fine for me.

Solution 3

It would be very messy to write a single regular expression which handles all of these possible URLs.

I would probably use an if ... else if ... else structure to determine which form the url is in and then use a smaller more specific regular expression to pull out each video ID.

Solution 4

You probably don't need a regex for this. There is very little variance in the pattern, and the delimiters themselves (/, and sometimes ?, =, or #) are unchanging. I recommend you take this in steps, using plain old string manipulation to decide your next move:

  1. Split the URL on /.
  2. Ignore the http:// and www., if present.
  3. Check that the domain name is youtube.com or youtu.be.
  4. If the DN is youtu.be, the ID is the next segment. Return it and stop.
  5. Start parsing parameters. Check the next segment:
    • If it's embed, return the following segment in full.
    • If it's v, split on ? and return the first part.
    • If it's user, count four segments ahead and you'll have your ID.
    • If it's watch, split on ? and then on =.

...etc.

I don't know how many possible patterns there are for YouTube URLs, but if you have the full list of formats, you can simply build up an if/else tree around them. My main advice is just to split on / and go from there, using contextual hints in the URL to determine how to parse the rest of it.

Solution 5

Try this:

var urls = 
["http://www.youtube.com/sandalsResorts#p/c/54B8C800269D7C1B/0/FJUvudQsKCM",
"http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo",
"http://youtu.be/NLqAF9hrVbY",
"http://www.youtube.com/embed/NLqAF9hrVbY",
"https://www.youtube.com/embed/NLqAF9hrVbY",
"http://www.youtube.com/v/NLqAF9hrVbY?fs=1&hl=en_US",
"http://www.youtube.com/watch?v=NLqAF9hrVbY",
"http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo",
"http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I",
"http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo",
"http://www.youtube.com/watch?v=JYArUl0TzhA&feature=featured"];

var ids = []; 

for(var i in urls) {
    tmp = urls [ i ];
    tmp2 = get_video_id(tmp);
    if(tmp2 != null)
    {
        ids.push("url:" + tmp + " ID:" + tmp2);
    }
}

alert(ids.join("\n"));



function get_video_id(input) {
return input.match(/(?:youtu\.be\/|youtube\.com(?:\/embed\/|\/v\/|\/watch\?v=|\/user\/\S+|\/ytscreeningroom\?v=|\/sandalsResorts#\w\/\w\/.*\/))([^\/&]{10,12})/)[1]; 
}

Output:

url:http://www.youtube.com/sandalsResorts#p/c/54B8C800269D7C1B/0/FJUvudQsKCM ID:FJUvudQsKCM
url:http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo ID:p3vcRhsYGo
url:http://youtu.be/NLqAF9hrVbY ID:NLqAF9hrVbY
url:http://www.youtube.com/embed/NLqAF9hrVbY ID:NLqAF9hrVbY
url:https://www.youtube.com/embed/NLqAF9hrVbY ID:NLqAF9hrVbY
url:http://www.youtube.com/v/NLqAF9hrVbY?fs=1&hl=en_US ID:NLqAF9hrVbY?
url:http://www.youtube.com/watch?v=NLqAF9hrVbY ID:NLqAF9hrVbY
url:http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo ID:p3vcRhsYGo
url:http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I ID:NRHVzbJVx8I
url:http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo ID:p3vcRhsYGo
url:http://www.youtube.com/watch?v=JYArUl0TzhA&feature=featured ID:JYArUl0TzhA
Share:
40,143
Stanley
Author by

Stanley

Updated on February 08, 2020

Comments

  • Stanley
    Stanley about 4 years

    I've looked all over and I've seen many ways to parse the video ID off a URL for youtube, however, none of them have matched all the various formats the YouTube url could be in. I've tried messing with regex presented in the previous posts, but nothing seemed to work.

    The closest post I found that covered all the various URL formats was this one: How do I find all YouTube video ids in a string using a regex?

    However, this does not work for: http://www.youtube.com/sandalsResorts#p/c/54B8C800269D7C1B/0/FJUvudQsKCM

    I'm doing this in Javascript. Can someone help?!

    Thanx in advance.

    Current URL formats and script I am using:

    var url = "http://www.youtube.com/sandalsResorts#p/c/54B8C800269D7C1B/0/FJUvudQsKCM";
    //var url = "http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo";
    //var url = "http://youtu.be/NLqAF9hrVbY";
    //var url = "http://www.youtube.com/embed/NLqAF9hrVbY";
    //var url = "https://www.youtube.com/embed/NLqAF9hrVbY";
    //var url = "http://www.youtube.com/v/NLqAF9hrVbY?fs=1&hl=en_US";
    //var url = "http://www.youtube.com/watch?v=NLqAF9hrVbY";
    //var url = "http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo";
    //var url = "http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I";
    //var url = "http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo";
    //var url = "http://www.youtube.com/watch?v=JYArUl0TzhA&feature=featured";
    
    var videoID = url.match(/(?:youtu\.be\/|youtube\.com(?:\/embed\/|\/v\/|\/watch\?v=|\/user\/\S+|\/ytscreeningroom\?v=))([\w\-]{10,12})\b/)[1];
    alert(videoID);