Для .+$
в конце требуется как минимум один символ после последней цифры, которая записывается в виде строки цифр. Это отрубит одну цифру от того, что захвачено. Есть ли причина, по которой у вас это есть?
Вы можете изменить последний +
на *
следующим образом:
/^http:\/\/(?:.*?)\.?(youtube|vimeo)\.com\/(watch\?[^#]*v=(\w+)|(\d+)).*$/
или, что еще лучше, полностью избавьтесь от концевой части, так как она не выглядит так, как нужно:
/^http:\/\/(?:.*?)\.?(youtube|vimeo)\.com\/(watch\?[^#]*v=(\w+)|(\d+))/
Вот немного более безопасный способ написания вашей функции, которая учитывает любой порядок параметров запроса в URL-адресе YouTube и не помещает в регулярное выражение то, что там не требуется. Код длиннее, но он намного надежнее и гораздо проще добавить больше провайдеров:
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);
}
Рабочая версия здесь: http://jsfiddle.net/jfriend00/N2hPj/