4

I have the following code which detect the video id from a string. It actually catch more cases that I need, and I would like to make it more simply and return the id only for string in this formats:

https://www.youtube.com/watch?v=85PMSYAguZ8
https://youtu.be/85PMSYAguZ8

Code:

_getVideoIdFromUrl: function (value) {
var regEx = /^(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((\w|-){11})(?:\S+)?$/;
var matches = value.match(regEx);
if (matches) {
    return matches[1];
}
return false;

},

I would need help to change the regEx accordingly, any ideas?

Currently it detects:

YES   'http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel',
YES   'http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub',
YES   'http://youtu.be/6dwqZw0j_jY',
YES   'http://www.youtube.com/watch?v=6dwqZw0j_jY&feature=youtu.be',    
YES   'http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub',
YES   'http://www.youtube.com/embed/nas1rJpm7wY?rel=0',
YES   'http://www.youtube.com/watch?v=peFZbP64dsU',
YES   'http://youtube.com/v/dQw4w9WgXcQ?feature=youtube_gdata_player',
YES   'http://youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player',
YES   'http://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player',  
YES   'http://youtu.be/afa-5HQHiAs',
YES   'http://youtu.be/dQw4w9WgXcQ?feature=youtube_gdata_player'
NO    '//www.youtube-nocookie.com/embed/up_lNV-yoK4?rel=0',
NO    'http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo',
NO    'http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I',
NO    'http://www.youtube.com/user/SilkRoadTheatre#p/a/u/2/6dwqZw0j_jY',
NO    'http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo?rel=0',
NO    'http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel',
NO    'http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I',
NO    'http://youtube.com/vi/dQw4w9WgXcQ?feature=youtube_gdata_player',
NO    'http://youtube.com/?v=dQw4w9WgXcQ&feature=youtube_gdata_player',
NO    'http://youtube.com/?vi=dQw4w9WgXcQ&feature=youtube_gdata_player',
NO    'http://youtube.com/watch?vi=dQw4w9WgXcQ&feature=youtube_gdata_player',
Radex
  • 4,700
  • 11
  • 33
  • 64
  • Sounds a good idea, could you please provide me a quick example, I am not very familiar with regex. – Radex Feb 24 '17 at 14:10
  • This is a very very basic regex. `https://(?:www\.youtube\.com/watch\?v=|youtu\.be/)([\w-]{11})`. – Aran-Fey Feb 24 '17 at 15:04
  • [Solved here: best wor around so far](https://stackoverflow.com/questions/3392993/php-regex-to-get-youtube-video-id/17030234) – Ramil Verdiyev Jan 31 '18 at 19:58

2 Answers2

4

Try this:

urls = ['http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel',
'http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub',
'http://youtu.be/6dwqZw0j_jY',
'http://www.youtube.com/watch?v=6dwqZw0j_jY&feature=youtu.be',
'http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub',
'http://www.youtube.com/embed/nas1rJpm7wY?rel=0',
'http://www.youtube.com/watch?v=peFZbP64dsU',
'http://youtube.com/v/dQw4w9WgXcQ?feature=youtube_gdata_player',
'http://youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player',
'http://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player',
'http://youtu.be/afa-5HQHiAs',
'http://youtu.be/dQw4w9WgXcQ?feature=youtube_gdata_player',
'//www.youtube-nocookie.com/embed/up_lNV-yoK4?rel=0',
'http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo',
'http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I',
'http://www.youtube.com/user/SilkRoadTheatre#p/a/u/2/6dwqZw0j_jY',
'http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo?rel=0',
'http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel',
'http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I',
'http://youtube.com/vi/dQw4w9WgXcQ?feature=youtube_gdata_player',
'http://youtube.com/?v=dQw4w9WgXcQ&feature=youtube_gdata_player',
'http://youtube.com/?vi=dQw4w9WgXcQ&feature=youtube_gdata_player',
'http://youtube.com/watch?vi=dQw4w9WgXcQ&feature=youtube_gdata_player']

_getVideoIdFromUrl = function (value) {
  var regEx = "^(?:https?:)?//[^/]*(?:youtube(?:-nocookie)?\.com|youtu\.be).*[=/]([-\\w]{11})(?:\\?|=|&|$)";
  var matches = value.match(regEx);
  if (matches) {
      console.log(value + "\n" + matches[1] + "\n");
  }
  return false;
}

urls.forEach(function(url) {
  _getVideoIdFromUrl(url)
});
SLePort
  • 14,405
  • 3
  • 28
  • 39
0

I would do something like this:
It gets video id of all examples you specified

const urls = ['http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel',
'http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub',
'http://youtu.be/6dwqZw0j_jY',
'http://www.youtube.com/watch?v=6dwqZw0j_jY&feature=youtu.be',
'http://www.youtube.com/watch?v=yZ-K7nCVnBI&playnext_from=TL&videos=osPknwzXEas&feature=sub',
'http://www.youtube.com/embed/nas1rJpm7wY?rel=0',
'http://www.youtube.com/watch?v=peFZbP64dsU',
'http://youtube.com/v/dQw4w9WgXcQ?feature=youtube_gdata_player',
'http://youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player',
'http://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player',
'http://youtu.be/afa-5HQHiAs',
'http://youtu.be/dQw4w9WgXcQ?feature=youtube_gdata_player',
'//www.youtube-nocookie.com/embed/up_lNV-yoK4?rel=0',
'http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo',
'http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I',
'http://www.youtube.com/user/SilkRoadTheatre#p/a/u/2/6dwqZw0j_jY',
'http://www.youtube.com/user/Scobleizer#p/u/1/1p3vcRhsYGo?rel=0',
'http://www.youtube.com/watch?v=cKZDdG9FTKY&feature=channel',
'http://www.youtube.com/ytscreeningroom?v=NRHVzbJVx8I',
'http://youtube.com/vi/dQw4w9WgXcQ?feature=youtube_gdata_player',
'http://youtube.com/?v=dQw4w9WgXcQ&feature=youtube_gdata_player',
'http://youtube.com/?vi=dQw4w9WgXcQ&feature=youtube_gdata_player',
'http://youtube.com/watch?vi=dQw4w9WgXcQ&feature=youtube_gdata_player']

const getVideoId = (url) => {
  if (/^(?:http:\/\/)?youtu\.be/.test(url)){
    return url.match(/^(?:http:\/\/)?youtu\.be\/(.{11})/)[1]
  } else if (/^(?:(?:http:)?\/\/)?(?:www\.)?youtube(?:-nocookie)?.com/.test(url)){
    let match = url.match(/(?:http:\/\/)?(?:www\.)?youtube\.com.*?v=(.{11})/)
    if (!match) match = url.match(/(?:vi=|vi?\/|embed\/)(.{11})/)
    if (!match && /user/.test(url)) {
      match = url.split('/')
      return match[match.length - 1].split('?')[0]
    }
    return (match || [,url])[1]
  } else return null
}

for (let url of urls){
  console.log(url)
  console.log(getVideoId(url))
}
Maciej Kozieja
  • 1,532
  • 1
  • 8
  • 28