Improving regex for parsing YouTube / Vimeo URLs

后端 未结 11 1507
半阙折子戏
半阙折子戏 2020-12-13 20:52

I\'ve made a function (in JavaScript) that takes an URL from either YouTube or Vimeo. It figures out the provider and ID for that particular video (demo: http://jsfiddle.net

相关标签:
11条回答
  • 2020-12-13 21:11

    3) Your regex does not match https url's. I haven't tested it, but I guess the "http://" part would become "http(s)?://". Note that this would change the matching positions of the provider and id.

    0 讨论(0)
  • 2020-12-13 21:13

    Here is my regex

    http://jsfiddle.net/csjwf/1/

    0 讨论(0)
  • 2020-12-13 21:13

    For Vimeo, Don't rely on Regex as Vimeo tends to change/update their URL pattern every now and then. As of October 2nd, 2017, there are in total of six URL schemes Vimeo supports.

    https://vimeo.com/*
    https://vimeo.com/*/*/video/*
    https://vimeo.com/album/*/video/*
    https://vimeo.com/channels/*/*
    https://vimeo.com/groups/*/videos/*
    https://vimeo.com/ondemand/*/*
    

    Instead, use their API to validate vimeo URLs. Here is this oEmbed (doc) API which takes an URL, checks its validity and return a object with bunch of video information(check out the dev page). Although not intended but we can easily use this to validate whether a given URL is from Vimeo or not.

    So, with ajax it would look like this,

    var VIMEO_BASE_URL = "https://vimeo.com/api/oembed.json?url=";
    var yourTestUrl = "https://vimeo.com/23374724";
    
    
    $.ajax({
      url: VIMEO_BASE_URL + yourTestUrl,
      type: 'GET',
      success: function(data) {
        if (data != null && data.video_id > 0)
          // Valid Vimeo url
        else
          // not a valid Vimeo url
      },
      error: function(data) {
        // not a valid Vimeo url
      }
    });
    
    0 讨论(0)
  • 2020-12-13 21:13

    I had a task to enable adding a dropbox videos. So the same input should take href, check it and transform to the playable link which I can then insert in .

    const getPlayableUrl = (url) => {
        // Check youtube and vimeo
        let firstCheck = url.match(/(http:|https:|)\/\/(player.|www.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com))\/(video\/|embed\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(\&\S+)?/);
    
        if (firstCheck) {
            if (RegExp.$3.indexOf('youtu') > -1) {
                return "//www.youtube.com/embed/" + RegExp.$6;
            } else if (RegExp.$3.indexOf('vimeo') > -1) {
                return 'https://player.vimeo.com/video/' + RegExp.$6
            }
        } else {
            // Check dropbox
            let candidate = ''
            if (url.indexOf('.mp4') !== -1) {
                candidate = url.slice(0, url.indexOf('.mp4') + 4)
            } else if (url.indexOf('.m4v') !== -1) {
                candidate = url.slice(0, url.indexOf('.m4v') + 4)
            } else if (url.indexOf('.webm') !== -1) {
                candidate = url.slice(0, url.indexOf('.webm') + 5)
            }
    
            let secondCheck = candidate.match(/(http:|https:|)\/\/(player.|www.)?(dropbox\.com)\/(s\/|embed\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*\/)?(.*)/);
            if (secondCheck) {
                return 'https://dropbox.com/' + RegExp.$4 + RegExp.$5 + RegExp.$6 + '?raw=1'
            } else {
                throw Error("Not supported video resource.");
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-13 21:23

    Regex is wonderfully terse but can quickly get complicated.

    http://jsfiddle.net/8nagx2sk/

    function parseYouTube(str) {
        // link : //youtube.com/watch?v=Bo_deCOd1HU
        // share : //youtu.be/Bo_deCOd1HU
        // embed : //youtube.com/embed/Bo_deCOd1HU
    
        var re = /\/\/(?:www\.)?youtu(?:\.be|be\.com)\/(?:watch\?v=|embed\/)?([a-z0-9_\-]+)/i; 
        var matches = re.exec(str);
        return matches && matches[1];
    }
    
    function parseVimeo(str) {
        // embed & link: http://vimeo.com/86164897
    
        var re = /\/\/(?:www\.)?vimeo.com\/([0-9a-z\-_]+)/i;
        var matches = re.exec(str);
        return matches && matches[1];
    }
    

    Sometimes simple code is nicer to your fellow developers.

    https://jsfiddle.net/1dzb5ag1/

    // protocol and www neutral
    function getVideoId(url, prefixes) {
      var cleaned = url.replace(/^(https?:)?\/\/(www\.)?/, '');
      for(var i = 0; i < prefixes.length; i++) {
        if (cleaned.indexOf(prefixes[i]) === 0)
          return cleaned.substr(prefixes[i].length)
      }
      return undefined;
    }
    
    function getYouTubeId(url) {
      return getVideoId(url, [
        'youtube.com/watch?v=',
        'youtu.be/',
        'youtube.com/embed/',
        'youtube.googleapis.com/v/'
      ]);
    }
    
    function getVimeoId(url) {
      return getVideoId(url, [
        'vimeo.com/',
        'player.vimeo.com/'
      ]);
    }
    

    Which do you prefer to update?

    0 讨论(0)
提交回复
热议问题