【问题标题】:Extract YouTube ID with or without RegEx使用或不使用 RegEx 提取 YouTube ID
【发布时间】:2016-05-27 21:48:58
【问题描述】:

请告诉我如何在不使用正则表达式的情况下获取 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

【问题讨论】:

    标签: java regex youtube


    【解决方案1】:

    你可以使用下面的正则表达式

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

    RegEx 拆分:

    1. ^:行首anchor
    2. (?:(?:https?:\/\/)?(?:www\.)?)?:
      • (?:https?:\/\/)?:匹配 http://https:// 可选
      • (?:www\.)?)?:匹配www. 零次或一次
    3. (youtube(?:-nocookie)?\.com|youtu\.be)\/: 匹配任一
      • youtube.comyoutube-nocookie.comyoutu.be 后跟 /
    4. .*?: 懒人匹配。匹配直到满足下一个模式。
    5. (?:embed|e|v|watch\?.*?v=)?\/?:
      • (?:embed|e|v|watch\?.*?v=)?:匹配 embedev 或从 watch?v= 或不匹配
      • \/?:匹配 / 零次或一次
    6. ([a-z0-9]+):匹配一个或多个字母数字字符并将其添加到捕获的组中。

    现场演示使用 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;
    }
    &lt;pre id="output"&gt;&lt;/pre&gt;

    【讨论】:

    • @Piraba 我认为在将正则表达式添加为字符串时需要将反斜杠加倍。
    • 我添加了反斜杠String expression = "/^(?:(?:https?:\\/\\/)?(?:www\\.)?)?(youtube(?:-nocookie)?\\.com|youtu\\.be)\\/.*?(?:embed|e|v|watch\\?.*?v=)?\\/?([a-z0-9]+)/i";。不工作
    • @Piraba 您需要使用if(matcher.find()) 而不是if(matcher.matches()) 并打印组2。示例:if (matcher.find()) { video_id = matcher.group(2); }
    • @Tushar - 底部的“flow-illustration”看起来是生成的。如何,在哪里?!?
    • @T4NK3R regexper.com 就是一个例子。以上是Atom编辑器生成的regex-railroad-diagram包。
    【解决方案2】:

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

    1. 从您的 URL 字符串构造 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,例如。 g.,通过跳过前 3 个符号: url.getPath().substring(3)

    更新。为什么不是正则表达式?因为标准的 JDK URL 解析器更加健壮。整个 Java 社区都在对其进行测试,而基于 RegExp 的重新发明轮子仅由您自己的代码进行测试。

    【讨论】:

    • 这不是他问题的答案。
    • 他要求一种从字符串中获取视频 ID 的方法(使用或不使用正则表达式),我提出了一种方法。你为什么不认为这是一个答案?
    • 实际上 - 这是一个非常优雅的解决方案,因为它意识到可以通过分析或查询参数或路径参数来编组所有 URL。非常适合我。
    【解决方案3】:

    我喜欢对所有 YouTube 视频 ID 使用此功能。我通过 url 并只返回 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/

    【讨论】:

      猜你喜欢
      • 2016-04-22
      • 2011-07-04
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多