2012-03-04 98 views
12

域和视频ID,我复制功能,将采取一个YouTube/VIMEO URL并返回视频从什么网站来(VIMEO/YT),以及视频ID。正则表达式来提取的YouTube/VIMEO网址

这是我到目前为止有: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西元,如果URL中的ID结束时,最后的号码总是被切断。如果您在vimeo网址的末尾添加了斜杠,则会完全拉取该ID。

+1

我会在这里留下[this](http://gskinner.com/RegExr/)。 – Shea 2012-03-04 06:35:35

+0

@andrewjackson我更喜欢[this](http://regex.larsolavtorvik.com/)之一。 – Petah 2012-03-04 06:40:10

+0

@andrew ..是我以前使用过该工具,并且对于理解正则表达式的人来说是def。 – 2012-03-04 06:43:57

回答

14

.+$最后要求最后一位数字后面至少有一个字符作为一串数字被捕获。这将会俘获一个数字。你有这样的理由吗?

您可以将最后+更改为*这样的:

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

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

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

这里有一个更安全的方法来编写你的函数,它允许在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); 
} 

工作版本在这里:“+” http://jsfiddle.net/jfriend00/N2hPj/

+0

较短的正则表达式获胜!我和第二个一起去了,效果很棒!非常感谢! – 2012-03-04 06:53:25

+0

@RyanEllis - 仅供参考,我在我的回答中添加了一个更加健壮的函数版本,它对youtube字符串中的查询参数顺序不敏感,并且不允许混合使用vimeo格式和youtube格式的非法URL。 – jfriend00 2012-03-04 06:56:20

+0

不错的工作!我刚刚用你的旧功能取代了它,它似乎更快(不知道这是多么真实) 感谢AWESOME功能,它也使其他视频提供者也更容易!我可以让你在整个项目的背后口袋里吗? ;) – 2012-03-04 07:01:51

0

最后号码被切断,因为你使用最后,这意味着“一个或多个任何角色”。将*替换为*,表示“零个或多个”。

+0

感谢您的答案和解释! – 2012-03-04 06:53:44

2

为了简化您的正则表达式我会用haystack.indexOf(针),以确定该网址是VIMEO或YouTube,然后应用现场特定正则表达式。更容易,后来你可以添加视频网站,而不会过分复杂的正则表达式。

+0

我喜欢它!这使得未来更容易,谢谢! – 2012-03-04 06:51:27

+0

很高兴帮助好友:) – 2012-03-04 06:52:25

0

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

0

删除最后一个。并最终匹配

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

3

这里有一个更新的版本,也可用于youtu.be和youtube.com/embed使用@ jfriend00的代码,并在这里发现了一些代码的URL:JavaScript REGEX: How do I get the YouTube video id from a 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; 
     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/

出了两回答#的,这是最终的工作最适合我的代码。

+0

YouTube的ID不显示 – Carlos 2014-08-02 16:00:05

+1

道歉。不知道哪里出了问题,但我已经更新了我的答案和小提琴。 – reblevins 2014-08-05 19:57:17

+0

如果有人通过像“https://www.youtube.com/watch” 这样的网址会出现错误 - 无法读取undefined属性'split'undefined – anonymous 2017-06-15 10:57:32