Regex для извлечения идентификатора домена и видео с URL-адреса youtube/vimeo
Я копирую функцию, которая возьмет URL-адрес youtube/vimeo и вернет, с какого сайта вышло видео (vimeo/yt), а также идентификатор видео.
Вот что я до сих пор: http://jsfiddle.net/csjwf/181/
<strong>Result:</strong>
<div id="result"></div>
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;
Вывод:
Result:
Provider: youtube
ID: PQLnmdOthmA
--
Provider: vimeo
ID: 2208013
Однако обратите внимание, как для vimeo vids, если URL-адрес заканчивается в ID, последний номер всегда отключается. Если вы добавите косую черту в конец URL-адреса vimeo, идентификатор полностью вытащится.
Ответы
Ответ 1
В конце .+$
требуется по крайней мере один символ после последней цифры, которая будет записана в виде строки цифр. Это отрубит одну цифру от того, что захвачено. Есть ли причина, по которой вы там?
Вы можете изменить последний +
на a *
следующим образом:
/^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/
Ответ 2
Вот обновленная версия, которая также работает с URL-адресами youtu.be и youtube.com/embed с использованием кода @jfriend00 и некоторого кода, найденного здесь: JavaScript REGEX: как мне получить Идентификатор видео YouTube с URL-адреса?.
EDIT: обновил мой ответ (и скрипку) с помощью функции, которая действительно работает.: -)
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;
var success = false;
if ( url.match('http(s)?://(www.)?youtube|youtu\.be') ) {
if (url.match('embed')) { retVal.id = url.split(/embed\//)[1].split('"')[0]; }
else { retVal.id = url.split(/v\/|v=|youtu\.be\//)[1].split(/[?&]/)[0]; }
retVal.provider = "youtube";
var videoUrl = 'https://www.youtube.com/embed/' + retVal.id + '?rel=0';
success = true;
} else if (matches = url.match(/vimeo.com\/(\d+)/)) {
retVal.provider = "vimeo";
retVal.id = matches[1];
var videoUrl = 'http://player.vimeo.com/video/' + retVal.id;
success = true;
}
if (success) {
return retVal;
}
else { alert("No valid media id detected"); }
}
И рабочий jsfiddle: http://jsfiddle.net/9n8Nn/3/
Из двух ответов stackexchange это код, который лучше всего работал у меня в конце.
Ответ 3
Чтобы упростить регулярное выражение, я бы использовал haystack.indexOf(игла), чтобы определить, является ли URL-адрес vimeo или youtube, а затем применяет регулярное выражение для сайта. Гораздо проще, и позже вы можете добавлять видеосайты, не слишком усложняя регулярное выражение.
Ответ 4
Последний номер отключается, потому что вы используете ". +" в конце, что означает "один или несколько символов". Замените символ + на *, что означает "ноль или больше".
Ответ 5
url.match(/^http:\/\/(?:.*?)\.?(youtube|vimeo)\.com\/(watch\?[^#]*v=(\w+).+|(\d+))$/);
Ответ 6
Удалите последнее. и конечное совпадение
url.match(/^http:\/\/(?:.*?)\.?(youtube|vimeo)\.com\/(watch\?[^#]*v=(\w+)|(\d+))/);