Extract YouTube ID with or without RegEx

后端 未结 3 1610
深忆病人
深忆病人 2021-01-13 13:32

Please let me know how to get youtube ID without going to regular expression?

Using above method following URL, didn\'t work

相关标签:
3条回答
  • 2021-01-13 14:01

    You can use following RegEx

    ^(?:(?:https?:\/\/)?(?:www\.)?)?(youtube(?:-nocookie)?\.com|youtu\.be)\/.*?(?:embed|e|v|watch\?.*?v=)?\/?([a-z0-9]+)

    RegEx Breakup:

    1. ^: Start of the line anchor
    2. (?:(?:https?:\/\/)?(?:www\.)?)?:
      • (?:https?:\/\/)?: Match http:// or https:// optionally
      • (?:www\.)?)?: Match www. zero or one time
    3. (youtube(?:-nocookie)?\.com|youtu\.be)\/: Match either
      • youtube.com or youtube-nocookie.com or youtu.be followed by /
    4. .*?: Lazy match. Match until the next pattern satisfies.
    5. (?:embed|e|v|watch\?.*?v=)?\/?:
      • (?:embed|e|v|watch\?.*?v=)?: Match embed or e or v or from watch? to v= or nothing
      • \/?: Match / zero or one time
    6. ([a-z0-9]+): Match one or more alphanumeric characters and add that in the captured group.

    Live DemoUsing JavaScript

    var regex = /^(?:(?:https?:\/\/)?(?:www\.)?)?(youtube(?:-nocookie)?\.com|youtu\.be)\/.*?(?:embed|e|v|watch\?.*?v=)?\/?([a-z0-9]+)/i;
    
    // An array of all the youtube URLs
    var youtubeLinks = [
        'http://www.youtube.com/e/dQw4w9WgXcQ',
        'http://www.youtube.com/watch?feature=player_embedded&v=dQw4w9WgXcQ',
        'http://www.youtube.com/v/0zM3nApSvMg?fs=1&hl=en_US&rel=0',
        'http://www.youtube.com/embed/0zM3nApSvMg?rel=0',
        'http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index',
        'http://www.youtube.com/watch?v=0zM3nApSvMg',
        'http://youtu.be/0zM3nApSvMg',
        'http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s',
        'http://youtu.be/dQw4w9WgXcQ',
        'http://www.youtube.com/embed/dQw4w9WgXcQ',
        'http://www.youtube.com/v/dQw4w9WgXcQ',
        'http://www.youtube.com/watch?v=dQw4w9WgXcQ',
        'http://www.youtube-nocookie.com/v/6L3ZvIMwZFM?version=3&hl=en_US&rel=0'
    ];
    
    // An object to store the results
    var youtubeIds = {};
    
    // Iterate over the youtube URLs
    youtubeLinks.forEach(function(url) {
        // Get the value of second captured group to extract youtube ID
        var id = "<span class='youtubeId'>" + (url.match(regex) || [0, 0, 'No ID present'])[2] + "</span>";
    
        // Add the URL and the extracted ID in the result object
        youtubeIds[url] = id;
    });
    
    // Log the object in the browser console
    console.log(youtubeIds);
    
    // To show the result on the page
    document.getElementById('output').innerHTML = JSON.stringify(youtubeIds, 0, 4);
    .youtubeId {
        color: green;
        font-weight: bold;
    }
    <pre id="output"></pre>

    0 讨论(0)
  • 2021-01-13 14:07

    Your regex is designed for youtu.be domain, of course it doesn't work with youtube.com one.

    1. Construct java.net.URL (https://docs.oracle.com/javase/7/docs/api/java/net/URL.html) from your URL string
    2. Use URL#getQuery() to get the query part
    3. Check Parse a URI String into Name-Value Collection for a ways to decode query part into a name-value map, and get value for name 'v'
    4. If there is no 'query' part (like in http://www.youtube.com/e/dQw4w9WgXcQ), then use URL#getPath() (which will give you /e/dQw4w9WgXcQ) and parse your video ID from it, e. g., by skipping first 3 symbols: url.getPath().substring(3)

    Update. Why not regex? Because standard JDK URL parser is much more robust. It is being tested by the whole Java community, while RegExp-based reinvented wheel is only tested by your own code.

    0 讨论(0)
  • 2021-01-13 14:13

    I like to use this function for all YouTube video ids. I pass through the url and return only the id. Check the fiddle below.

     var ytSrc = function( url ){
        var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/;
        var match = url.match(regExp);
        if (match&&match[7].length==11){
            return match[7];
        }else{
         alert("Url incorrecta");
        }
    
    }
    

    https://jsfiddle.net/keinchy/tL4thwd7/1/

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