正则表达式从youtube/vimeo网址中提取域名和视频ID

Rya*_*lis 12 javascript regex youtube url vimeo

我正在复制一个函数,它将获取youtube/vimeo url并返回视频来自的网站(vimeo/yt)以及视频ID.

这是我到目前为止所拥有的:http://jsfiddle.net/csjwf/181/

<strong>Result:</strong>
<div id="result"></div>
Run Code Online (Sandbox Code Playgroud)
function parseVideoURL(url) {

    url.match(/^http:\/\/(?:.*?)\.?(youtube|vimeo)\.com\/(watch\?[^#]*v=(\w+)|(\d+)).+$/);
    return {
        provider : RegExp.$1,
        id : RegExp.$1 == 'vimeo' ? RegExp.$2 : RegExp.$3
    }
}

var result = document.getElementById("result");
var video = parseVideoURL("http://www.youtube.com/watch?v=PQLnmdOthmA&feature=feedrec_grec_index");
result.innerHTML = "Provider: " + video.provider + "<br>ID: " + video.id;

var video = parseVideoURL("http://vimeo.com/22080133");

result.innerHTML += "<br>--<br>Provider: " + video.provider + "<br>ID: " + video.id;
Run Code Online (Sandbox Code Playgroud)

输出:

Result:
Provider: youtube
ID: PQLnmdOthmA
--
Provider: vimeo
ID: 2208013

但是,请注意vimeo vids的方式,如果url以ID结尾,则最后一个数字始终被截断.如果在vimeo url的末尾添加斜杠,则会完全拉出id.

jfr*_*d00 14

所述.+$在端部被要求被捕获作为数字的串的最后一位数字后的至少一个字符.这样可以剔除被捕获的数字.你有那个原因吗?

您可以将最后+一个更改为*:

/^http:\/\/(?:.*?)\.?(youtube|vimeo)\.com\/(watch\?[^#]*v=(\w+)|(\d+)).*$/
Run Code Online (Sandbox Code Playgroud)

甚至更好,完全摆脱末端部分,因为它看起来不像是需要的:

/^http:\/\/(?:.*?)\.?(youtube|vimeo)\.com\/(watch\?[^#]*v=(\w+)|(\d+))/
Run Code Online (Sandbox Code Playgroud)

这里有一个更安全的方式来编写你的函数,它允许在youtube URL中查询参数的任何顺序,并且不会将东西放入不需要存在的正则表达式中.代码更长,但它更强大,并且更容易添加更多提供程序:

function parseVideoURL(url) {

    function getParm(url, base) {
        var re = new RegExp("(\\?|&)" + base + "\\=([^&]*)(&|$)");
        var matches = url.match(re);
        if (matches) {
            return(matches[2]);
        } else {
            return("");
        }
    }

    var retVal = {};
    var matches;

    if (url.indexOf("youtube.com/watch") != -1) {
        retVal.provider = "youtube";
        retVal.id = getParm(url, "v");
    } else if (matches = url.match(/vimeo.com\/(\d+)/)) {
        retVal.provider = "vimeo";
        retVal.id = matches[1];
    }
    return(retVal);
}
Run Code Online (Sandbox Code Playgroud)

这里的工作版本:http://jsfiddle.net/jfriend00/N2hPj/