2012-03-04 35 views
12

Tôi đang sao chép một hàm sẽ nhận URL youtube/vimeo và trả về trang web video (vimeo/yt) cũng như id video.Regex để trích xuất tên miền và id video từ youtube/vimeo url

Dưới đây là những gì tôi có cho đến nay: 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; 

Output:

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

Tuy nhiên, hãy chú ý cách cho vids Vimeo, nếu url kết thúc trong ID, số cuối cùng luôn bị cắt. Nếu bạn thêm dấu gạch chéo vào cuối url vimeo thì id sẽ được kéo hoàn toàn.

+1

Tôi sẽ chỉ để [this] (http://gskinner.com/RegExr/) tại đây. – Shea

+0

@andrewjackson Tôi thích [this] (http://regex.larsolavtorvik.com/) một. – Petah

+0

@andrew .. vâng tôi đã sử dụng công cụ đó trước đây, và nó là def cho một người hiểu regex .. –

Trả lời

14

.+$ ở cuối yêu cầu ít nhất một ký tự sau chữ số cuối cùng được ghi lại dưới dạng chuỗi chữ số. Điều đó sẽ cắt một chữ số ra khỏi những gì được chụp. Có lý do nào bạn có ở đó không?

Bạn có thể thay đổi người cuối cùng + đến một * như thế này:

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

hoặc thậm chí tốt hơn, thoát khỏi phần cuối hoàn toàn vì nó không giống như nó cần thiết:

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

Dưới đây là một cách an toàn hơn để viết chức năng của bạn cho phép bất kỳ thứ tự tham số truy vấn nào trong URL youtube và không đưa nội dung vào regex mà không cần phải ở đó. Mã này dài hơn, nhưng nó mạnh mẽ hơn nhiều và sẽ dễ dàng hơn nhiều để bổ sung thêm các nhà cung cấp: phiên bản

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); 
} 

Làm việc ở đây: "+" http://jsfiddle.net/jfriend00/N2hPj/

+0

Regex ngắn hơn sẽ thắng! Tôi đã đi với một thứ 2 và nó hoạt động tuyệt vời! Cám ơn rất nhiều! –

+0

@RyanEllis - FYI, tôi thêm vào câu trả lời của tôi một phiên bản mạnh mẽ hơn của chức năng của bạn không nhạy cảm với thứ tự đối số truy vấn trong chuỗi youtube và không cho phép các URL bất hợp pháp kết hợp các định dạng vimeo và youtube. – jfriend00

+0

Làm tốt lắm! Tôi chỉ thay thế chức năng cũ của mình với chức năng cũ của bạn và có vẻ nhanh hơn (không chắc chắn như thế nào) Cảm ơn chức năng AWESOME, và nó cũng dễ dàng hơn cho các nhà cung cấp video khác !! Tôi có thể giữ bạn trong túi sau của tôi cho toàn bộ dự án này không? ;) –

0

số cuối bị cắt đứt bởi vì bạn đang sử dụng ở cuối, có nghĩa là "một hoặc nhiều ký tự". Thay thế dấu + bằng dấu *, có nghĩa là "không hoặc nhiều hơn".

+0

Cảm ơn câu trả lời VÀ lời giải thích !! –

2

Để đơn giản hóa regex của bạn, tôi sẽ sử dụng haystack.indexOf (kim) để xác định xem url là vimeo hay youtube và sau đó áp dụng regex cụ thể của trang web. Dễ dàng hơn nhiều và sau đó bạn có thể thêm các trang web video mà không làm phức tạp quá mức regex.

+0

Tôi thích nó! Điều đó làm cho mọi thứ dễ dàng hơn cho tương lai, cảm ơn! –

+0

vui mừng được giúp đỡ bạn bè :) –

0

url.match(/^http:\/\/(?:.*?)\.?(youtube|vimeo)\.com\/(watch\?[^#]*v=(\w+).+|(\d+))$/);

0

Xóa ảnh cuối cùng. và cuối cùng phù hợp với

url.match(/^http:\/\/(?:.*?)\.?(youtube|vimeo)\.com\/(watch\?[^#]*v=(\w+)|(\d+))/);

3

Dưới đây là một phiên bản cập nhật mà cũng làm việc với youtu.be và youtube.com/embed url sử dụng mã @ jfriend00 và một số mã tìm thấy ở đây: JavaScript REGEX: How do I get the YouTube video id from a URL?.

EDIT: Đã cập nhật câu trả lời của tôi (và câu đố) với hàm thực sự hoạt động. :-)

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"); } 
} 

Và một jsfiddle làm việc: http://jsfiddle.net/9n8Nn/3/

Trong số hai stackexchange câu trả lời, đây là đoạn code mà làm việc tốt nhất cho tôi cuối cùng.

+0

ID youtube không hiển thị – Carlos

+1

Xin lỗi vì điều đó. Không chắc chắn những gì đã đi sai, nhưng tôi đã cập nhật câu trả lời của tôi và fiddle. – reblevins

+0

điều gì sẽ xảy ra nếu ai đó chuyển url như "https://www.youtube.com/watch" bạn gặp lỗi- Không thể đọc thuộc tính 'chia' của không xác định – anonymous

Các vấn đề liên quan