使用或不使用RegEx提取YouTube ID

时间:2016-02-16 14:47:06

标签: java regex youtube

请告诉我如何获取youtube ID而不使用正则表达式?

在网址后面使用上述方法,无效

  

http://www.youtube.com/e/dQw4w9WgXcQ

     

http://www.youtube.com/watch?feature=player_embedded&v=dQw4w9WgXcQ

public static String extractYTId(String youtubeUrl) {
    String video_id = "";

    try {
        if(youtubeUrl != null && youtubeUrl.trim().length() > 0 && youtubeUrl.startsWith("http")) {
            String expression = "^.*((youtu.be" + "\\/)" + "|(v\\/)|(\\/u\\/w\\/)|(embed\\/)|(watch\\?))\\??v?=?([^#\\&\\?]*).*"; // var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/;
            //String expression = "^.*(?:youtu.be\\/|v\\/|e\\/|u\\/\\w+\\/|embed\\/|v=)([^#\\&\\?]*).*";
            CharSequence input = youtubeUrl;
            Pattern pattern = Pattern.compile(expression, Pattern.CASE_INSENSITIVE);
            Matcher matcher = pattern.matcher(input);
            if(matcher.matches()) {
                String groupIndex1 = matcher.group(7);
                if(groupIndex1 != null && groupIndex1.length() == 11)
                    video_id = groupIndex1;
            }
        }
    } catch(Exception e) {
        Log.e("YoutubeActivity", "extractYTId " + e.getMessage());
    }

    return video_id;
}

其他链接正常工作

  

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

3 个答案:

答案 0 :(得分:4)

您可以使用以下RegEx

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

RegEx分手:

  1. ^:行anchor
  2. 的开头
  3. (?:(?:https?:\/\/)?(?:www\.)?)?
    • (?:https?:\/\/)?:匹配http://https://可选
    • (?:www\.)?)?:匹配www.零次或一次
  4. (youtube(?:-nocookie)?\.com|youtu\.be)\/:匹配任何一个
    • youtube.comyoutube-nocookie.comyoutu.be后跟/
  5. .*?:懒惰的比赛。匹配直到下一个模式满足。
  6. (?:embed|e|v|watch\?.*?v=)?\/?
    • (?:embed|e|v|watch\?.*?v=)?:匹配embedevwatch?v=
    • \/?:匹配/零次或一次
  7. ([a-z0-9]+):匹配一个或多个字母数字字符,并将其添加到捕获的组中。
  8. 现场演示使用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);
    &#13;
    .youtubeId {
        color: green;
        font-weight: bold;
    }
    &#13;
    <pre id="output"></pre>
    &#13;
    &#13;
    &#13;

    RegEx Visualization Diagram

答案 1 :(得分:1)

你的正则表达式是为youtu.be域设计的,当然它不适用于youtube.com。

  1. 从您的网址字符串构建java.net.URL(https://docs.oracle.com/javase/7/docs/api/java/net/URL.html
  2. 使用URL#getQuery()获取查询部分
  3. 检查Parse a URI String into Name-Value Collection以查找将查询部分解码为名称 - 值地图的方法,并获取名称“v”的值
  4. 如果没有“查询”部分(例如在http://www.youtube.com/e/dQw4w9WgXcQ中),则使用URL#getPath()(它将为您提供/e/dQw4w9WgXcQ)并从中解析您的视频ID,例如:例如,跳过前3个符号:url.getPath()。substring(3)
  5. 更新。为什么不正则表达式?因为标准的JDK URL解析器更加健壮。它正在由整个Java社区进行测试,而基于RegExp的重新发明的轮子仅通过您自己的代码进行测试。

答案 2 :(得分:0)

我喜欢将此功能用于所有YouTube视频ID。我通过网址并只返回ID。检查下面的小提琴。

 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/