修改正则表达式以允许其他网址

时间:2014-08-05 22:34:38

标签: javascript jquery regex youtube vimeo

我已经用我的正则表达式尝试了所有内容,但我似乎无法根据我的新网址进行调整,这对我来说无效。

请参阅我的演示:http://jsfiddle.net/693y7/

基本上我需要从每个网址中提取视频ID,并确定它是youtube还是视频,它确定它的位置很好,但ID不适用于所有网址。

我没有写这个正则表达式,但我尝试添加用户,附加或运算符来尝试找到替代结果,但我只是没有得到任何地方,有人会介意帮助我更好地了解如何接近新的那些不在演示中工作的网址?

URLS:

var urls = [
    "//player.vimeo.com/video/84687115",
    "http://player.vimeo.com/video/25451551",
    "http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index",
    "http://www.youtube.com/user/usernamehere#p/a/u/1/QdK8U-VIH_o",
    "http://www.youtube.com/v/0zM3nApSvMg?fs=1&hl=en_US&rel=0",
    "http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s",
    "http://www.youtube.com/embed/0zM3nApSvMg?rel=0",
    "http://www.youtube.com/watch?v=0zM3nApSvMg",
    "https://youtube.googleapis.com/v/My2FRPA3Gf8",
    "http://youtu.be/0zM3nApSvMg",
    "http://vimeo.com/84687115",
    "http://vimeo.com/channels//84687115",
    "http://vimeo.com/groups//videos/84687115"
];

这是我用来匹配ID

的功能
function parseVideo(url) {

    url.match(/(http:|https:|)\/\/(player.|www.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com))\/(video\/|embed\/|watch\?v=|v\/|user\/)?([A-Za-z0-9._%-]*)(\&\S+)?/);

    if (RegExp.$3.indexOf('youtu') > -1) {
        var type = 'youtube';
    } else if (RegExp.$3.indexOf('vimeo') > -1) {
        var type = 'vimeo';
    }

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

我希望这是足够的信息!

3 个答案:

答案 0 :(得分:1)

您需要将channelsgroups添加到正则表达式中,并且还需要在网址中允许多个连续/

url.match(/(http:|https:|)\/\/(player.|www.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com))\/(video\/*|embed\/*|watch\?v=|v\/*|user\/*|channels\/*|groups\/*)?([A-Za-z0-9._%-]*)(\&\S+)?/);

答案 1 :(得分:1)

我认为你最好使用多个正则表达式。事实上,我可能会设置一些内容,以便每个预期的格式有一个正则表达式,它可以做两件事:1)明确地将它标识为某种格式,以及2)在所需部分周围放置一个匹配的组。如果将它们全部放在一个数组中,你可以编写一些循环遍历它们的代码,并在找到匹配的第一个代码时停止。

patterns = [ ... ] // all your different regexes
for (regex in patterns) {
    if (url.match(regex)) {
        // Grab the variables you need and return them.
    }
}

答案 2 :(得分:1)

您需要扩展网址中间的匹配器以允许 “渠道//”和“组//”作为有效值jsfiddle.net/693y7/1

/(http:|https:|)\/\/(player.|www.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com))\/(video\/|embed\/|watch\?v=|v\/|user\/|channels\/\/|groups\/\/videos\/)?([A-Za-z0-9._%-]*)(\&\S+)?/

正如您所指出的,这仍然不适用于您示例中的第4个网址。 要同时支持此网址,您还需要添加与“a / u / 1”匹配的其他匹配组,或者在正则表达式

(\/a\/u\/\d)?

正如我在评论中指出的那样,使用非正则表达式方法可能更简单, 假设视频ID始终位于网址的末尾,后面只有一些元参数,可以使用以下方法http://jsfiddle.net/693y7/2/

var sres = url.split("/");
var dirtyid = sres[sres.length-1];
return dirtyid.replace("watch?v=", "").split(/&|#|\?/)[0];

这种方法只是通过斜杠拆分网址,然后取最后一部分包含videoid和meta参数,并使用一些简单的替换和拆分操作来获取想要的视频ID。

虽然这种方法可能不是最容易扩展和调整新用例的方法,但网址类型可能比这么大的正则表达式更强大。

要获得服务类型,可以简单地对“youtu”和/或“vimeo”进行检查索引。