改进用于解析 YouTube / Vimeo URL 的正则表达式

新手上路,请多包涵

我创建了一个函数(使用 JavaScript),它从 YouTube 或 Vimeo 获取 URL。它计算出该特定视频的提供商和 ID(演示:http: //jsfiddle.net/csjwf/ )。

 function parseVideoURL(url) {

    var provider = url.match(/http:\/\/(:?www.)?(\w*)/)[2],
        id;

    if(provider == "youtube") {

        id = url.match(/http:\/\/(?:www.)?(\w*).com\/.*v=(\w*)/)[2];
    } else if (provider == "vimeo") {

        id = url.match(/http:\/\/(?:www.)?(\w*).com\/(\d*)/)[2];
    } else {
        throw new Error("parseVideoURL() takes a YouTube or Vimeo URL");
    }
    return {
        provider : provider,
        id : id
    }
}

它有效,但是作为正则表达式新手,我正在寻找改进它的方法。我正在处理的输入通常如下所示:

 http://vimeo.com/(id)
http://youtube.com/watch?v=(id)&blahblahblah.....

  1. 现在我正在做三个单独的匹配,尝试在一个表达式中完成所有事情是否有意义?如果是这样,如何?

2)现有的匹配是否可以更简洁?它们是否不必要地复杂?或者可能不够?

  1. 是否有任何无法解析的 YouTube 或 Vimeo URL?我已经尝试了很多,到目前为止它似乎工作得很好。

总结一下: 我只是在寻找改进上述功能的方法。任何意见是极大的赞赏。

原文由 Daniel 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 492
2 个回答

我不确定你的问题 3),但只要你对 url 形式的归纳是正确的,正则表达式可以组合成一个,如下所示:

 /http:\/\/(?:www.)?(?:(vimeo).com\/(.*)|(youtube).com\/watch\?v=(.*?)&)/

您将在不同的位置获得比赛(如果是 vimeo,则为第 1 和第 2 场比赛,如果是 youtube,则为第 3 场和第 4 场比赛),因此您只需要处理它。

或者,如果你非常确定 vimeo 的 id 只包含数字,那么你可以这样做:

 /http:\/\/(?:www.)?(vimeo|youtube).com\/(?:watch\?v=)?(.*?)(?:\z|&)/

提供者和 ID 将分别出现在第 1 场和第 2 场比赛中。

原文由 sawa 发布,翻译遵循 CC BY-SA 3.0 许可协议

这是我对正则表达式的尝试,它涵盖了大多数更新的案例:

 function parseVideo(url) {
    // - Supported YouTube URL formats:
    //   - http://www.youtube.com/watch?v=My2FRPA3Gf8
    //   - http://youtu.be/My2FRPA3Gf8
    //   - https://youtube.googleapis.com/v/My2FRPA3Gf8
    // - Supported Vimeo URL formats:
    //   - http://vimeo.com/25451551
    //   - http://player.vimeo.com/video/25451551
    // - Also supports relative URLs:
    //   - //player.vimeo.com/video/25451551

    url.match(/(https?\/\/)(player.|www.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com))\/(video\/|embed\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(\&\S+)?/);
    var type = null;
    if (RegExp.$3.indexOf('youtu') > -1) {
        type = 'youtube';
    } else if (RegExp.$3.indexOf('vimeo') > -1) {
        type = 'vimeo';
    }

    return {
        type: type,
        id: RegExp.$6
    };
}

原文由 Yangshun Tay 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题