使用正则表达式进行jQuery Youtube URL验证

时间:2010-06-03 09:31:53

标签: javascript jquery regex url youtube

我知道这里有很多问题已经回答https://stackoverflow.com/questions/tagged/youtube+regex,但无法找到与我类似的问题。

任何正文都有JavaScript正则表达式,用于验证下面列出的YouTube VIDEO网址行。只是想知道这样的URL可能在哪里

http://www.youtube.com/watch?v=bQVoAWSP7k4
http://www.youtube.com/watch?v=bQVoAWSP7k4&feature=popular
http://www.youtube.com/watch?v=McNqjYiFmyQ&feature=related&bhablah
http://youtube.com/watch?v=bQVoAWSP7k4

- 更新1-- - 更新2 -

这个工作得很好,但网址http://youtube.com/watch?v=bQVoAWSP7k4

失败了
var matches = $('#videoUrl').val().match(/http:\/\/(?:www\.)?youtube.*watch\?v=([a-zA-Z0-9\-_]+)/);
if (matches) {
    alert('valid');
} else {
    alert('Invalid');
}

8 个答案:

答案 0 :(得分:176)

ULTIMATE YOUTUBE REGEX

樱桃采摘

由于解释越来越长,我将最终结果置于顶部。随意复制+粘贴,然后继续前进。有关详细说明,请阅读下面的"完整故事"

/**
 * JavaScript function to match (and return) the video Id 
 * of any valid Youtube Url, given as input string.
 * @author: Stephan Schmitz <eyecatchup@gmail.com>
 * @url: https://stackoverflow.com/a/10315969/624466
 */
function ytVidId(url) {
  var p = /^(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((\w|-){11})(?:\S+)?$/;
  return (url.match(p)) ? RegExp.$1 : false;
}

全文

乍一看,{p> Amarghosh's regex看起来不错。但它:

  1. 不匹配包含破折号( - )的视频ID,
  2. 不验证ID长度(v=aav=aaaaaaaaaaaaaaaaaa返回有效),
  3. 并且根本不匹配安全网址(http s ://youtube.com/watch?valid_params)
  4. 要匹配https,短划线字符以及验证ID长度,这是我对Amarghosh正则表达式的修改版本的初步建议:

    ^https?:\/\/(?:www\.)?youtube\.com\/watch\?(?=.*v=((\w|-){11}))(?:\S+)?$

    更新1:网址与字符串

    在我发布上述模式后,我被问到:&#34;如果网址是这样的话怎么办;
    youtube.com/watch?gl=US&hl=en-US&v=bQVoAWSP7k4&#34;

    首先请注意,这根本不是网址RFC compliant URLs必须从计划开始! ;)

    无论如何,为了匹配任何表示引用YouTube视频的字符串,我更新了我的答案,以排除所需的网址方案。所以我的第二个建议如下:

    ^(?:https?:\/\/)?(?:www\.)?youtube\.com\/watch\?(?=.*v=((\w|-){11}))(?:\S+)?$

    更新2:最终的正则表达式

    然后我被要求添加对特殊情况的支持&#34 ;; youtu.be 短网址。最初我没有添加这些,因为它不是问题的具体部分。不过,我现在用所有可能&#34;特殊情况&#34; 更新了我的答案。这意味着我不仅添加了对youtu.be链接的支持,还支持了请求路径&#34; / v&#34;和&#34; /嵌入&#34;。

    所以,我可以介绍一下:我的最终和终极Youtube正则表达式:

    ^(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((\w|-){11})(?:\S+)?$

    匹配哪些字符串?

    现在这个模式适用于任何字符串,格式如下:

    没有方案和子域名(域名:youtu.be,路径:/)

    youtu.be/<video:id>   
    

    没有方案,有子域名(域名:youtu.be,路径:/)

    www.youtu.be/<video:id>     
    

    使用HTTP方案,没有子域名(域名:youtu.be,路径:/)

    http://youtu.be/<video:id>   
    

    使用HTTP方案和子域名(域名:youtu.be,路径:/)

    http://www.youtu.be/<video:id>   
    

    使用HTTPS方案,没有子域名(域名:youtu.be,路径:/)

    https://youtu.be/<video:id>     
    

    使用HTTPS方案和子域名(域名:youtu.be,路径:/)

    https://www.youtu.be/<video:id>   
    

    没有方案和子域名(域名:youtube.com,路径:/ embed)

    youtube.com/embed/<video:id>   
    youtube.com/embed/<video:id>&other_params 
    

    没有方案,有子域名(域名:youtube.com,路径:/ embed)

    www.youtube.com/embed/<video:id>   
    www.youtube.com/embed/<video:id>&other_params   
    

    使用HTTP方案,没有子域名(域名:youtube.com,路径:/ embed)

    http://youtube.com/embed/<video:id>   
    http://youtube.com/embed/<video:id>&other_params  
    

    使用HTTP方案和子域名(域名:youtube.com,路径:/ embed)

    http://www.youtube.com/embed/<video:id>   
    http://www.youtube.com/embed/<video:id>&other_params  
    

    使用HTTPS方案,没有子域名(域名:youtube.com,路径:/ embed)

    https://youtube.com/embed/<video:id>   
    https://youtube.com/embed/<video:id>&other_params    
    

    使用HTTPS方案和子域名(域名:youtube.com,路径:/ embed)

    https://www.youtube.com/embed/<video:id>   
    https://www.youtube.com/embed/<video:id>&other_params
    

    没有方案和子域名(域名:youtube.com,路径:/ v)

    youtube.com/v/<video:id>   
    youtube.com/v/<video:id>&other_params 
    

    没有方案,有子域名(域名:youtube.com,路径:/ v)

    www.youtube.com/v/<video:id>   
    www.youtube.com/v/<video:id>&other_params   
    

    使用HTTP方案,没有子域名(域名:youtube.com,路径:/ v)

    http://youtube.com/v/<video:id>   
    http://youtube.com/v/<video:id>&other_params  
    

    使用HTTP方案和子域名(域名:youtube.com,路径:/ v)

    http://www.youtube.com/v/<video:id>   
    http://www.youtube.com/v/<video:id>&other_params  
    

    使用HTTPS方案,没有子域名(域名:youtube.com,路径:/ v)

    https://youtube.com/v/<video:id>   
    https://youtube.com/v/<video:id>&other_params    
    

    使用HTTPS计划和子域名(域名:youtube.com,路径:/ v)

    https://www.youtube.com/v/<video:id>   
    https://www.youtube.com/v/<video:id>&other_params   
    

    没有方案和子域名(域名:youtube.com,路径:/ watch)

    youtube.com/watch?v=<video:id>   
    youtube.com/watch?v=<video:id>&other_params   
    youtube.com/watch?other_params&v=<video:id> 
    youtube.com/watch?other_params&v=<video:id>&more_params  
    

    没有方案,有子域名(域名:youtube.com,路径:/ watch)

    www.youtube.com/watch?v=<video:id>   
    www.youtube.com/watch?v=<video:id>&other_params   
    www.youtube.com/watch?other_params&v=<video:id>  
    www.youtube.com/watch?other_params&v=<video:id>&more_params   
    

    使用HTTP方案,没有子域名(域名:youtube.com,路径:/ watch)

    http://youtube.com/watch?v=<video:id>   
    http://youtube.com/watch?v=<video:id>&other_params   
    http://youtube.com/watch?other_params&v=<video:id>   
    http://youtube.com/watch?other_params&v=<video:id>&more_params  
    

    使用HTTP方案和子域名(域名:youtube.com,路径:/ watch)

    http://www.youtube.com/watch?v=<video:id>   
    http://www.youtube.com/watch?v=<video:id>&other_params   
    http://www.youtube.com/watch?other_params&v=<video:id>   
    http://www.youtube.com/watch?other_params&v=<video:id>&more_params  
    

    使用HTTPS方案,没有子域名(域名:youtube.com,路径:/ watch)

    https://youtube.com/watch?v=<video:id>   
    https://youtube.com/watch?v=<video:id>&other_params   
    https://youtube.com/watch?other_params&v=<video:id>   
    https://youtube.com/watch?other_params&v=<video:id>&more_params     
    

    使用HTTPS方案和子域名(域名:youtube.com,路径:/ watch)

    https://www.youtube.com/watch?v=<video:id>   
    https://www.youtube.com/watch?v=<video:id>&other_params   
    https://www.youtube.com/watch?other_params&v=<video:id>
    https://www.youtube.com/watch?other_params&v=<video:id>&more_params  
    

    功能用途

    使用该模式最简单的方法是将其包装成一个函数,例如:

    &#13;
    &#13;
    /**
     * JavaScript function to match (and return) the video Id
     * of any valid Youtube Url, given as input string.
     * @author: Stephan Schmitz <eyecatchup@gmail.com>
     * @url: https://stackoverflow.com/a/10315969/624466
     */
    function ytVidId(url) {
      var p = /^(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((\w|-){11})(?:\S+)?$/;
      return (url.match(p)) ? RegExp.$1 : false;
    }
    
    // for example snippet only!
    document.body.addEventListener('click', function(e) {
        if (e.target.className == 'yt-url' && 'undefined' !== e.target.value) {
            var ytId = ytVidId(e.target.value);
            alert(e.target.value + "\r\nResult: " + (!ytId ? 'false' : ytId));
        }
    }, false);
    &#13;
    <!-- Click the buttons to probe URLs -->
    <input type="button" value="https://www.youtube.com/watch?v=p-e2G_VcTms&feature=g-logo&context=G29aead6FOAAAAAAABAA" class="yt-url">
    <input type="button" value="https://www.youtube.com/latest" class="yt-url">
    &#13;
    &#13;
    &#13;

    如果函数的结果值的类型必须是布尔值,则只需将RegExp.$1替换为true。那就是它。

    关于视频ID长度的最后一个注释:有人问过id是否有11个字符的固定长度?如果将来可能发生变化?

    这个问题的最佳答案可能也是唯一的#34;官员&#34;我发现here并且说:&#34;我在文档中的任何地方都没有看到我们正式承诺为YouTube视频ID标准长度为11个字符的声明。它是我们当前实现的那些事情之一,它可能无限期地保持这种状态。但我们并未对此提供任何正式承诺,因此请自担风险。&#34;

答案 1 :(得分:20)

^http:\/\/(?:www\.)?youtube.com\/watch\?v=\w+(&\S*)?$

//if v can be anywhere in the query list

^http:\/\/(?:www\.)?youtube.com\/watch\?(?=.*v=\w+)(?:\S+)?$

答案 2 :(得分:4)

您无法将id-part与\ w +匹配,因为它不包含短划线字符( - )。 [a-zA-Z0-9 _-] +会更正确。

答案 3 :(得分:2)

@eyecatchup ubove有一个优秀的正则表达式,但在regexper.com的帮助下 我看到他的正则表达式将通过任何youtube url,其中?v参数的值为任何单词或 - 符号重复11次。但youtube特别将视频ID限制为11个字符,因此修复他的正则表达式

/^(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((.|-){11})(?:\S+)?$/

比较他的正则表达式的vizualization

http://www.regexper.com/#/%5E%28?:https?:%5C/%5C/%29?%28?:www%5C.%29?%28?:youtu%5C.be%5C/%7Cyoutube%5C.com%5C/%28?:embed%5C/%7Cv%5C/%7Cwatch%5C?v=%7Cwatch%5C?.%2b&v=%29%29%28%28%5Cw%7C-%29%7B11%7D%29%28?:%5CS%2b%29?$/

和我的修复

http://www.regexper.com/#%2F%5E(%3F%3Ahttps%3F%3A%5C%2F%5C%2F)%3F(%3F%3Awww%5C.)%3F(%3F%3Ayoutu%5C.be%5C%2F%7Cyoutube%5C.com%5C%2F(%3F%3Aembed%5C%2F%7Cv%5C%2F%7Cwatch%5C%3Fv%3D%7Cwatch%5C%3F.%2B%26v%3D))((%5Ba-zA-Z0-9%5D%7C-)%7B11%7D)(%3F%3A%5CS%2B)%3F%24%2F

作为对将来改变的11个字符限制的编辑,那么当前的正则表达式将意味着任何单词或 - 必须重复11次,我的修复是

/^(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((\w|-){11,})(?:\S+)?$/

答案 4 :(得分:1)

改善@ eyecatchUp的伟大正则表达式:

  1. 添加对m.youtube.com域
  2. 的支持
  3. 通过@Nijikokun
  4. 添加对youtube-nocookie.com域名的支持
    ^(?:https?:\/\/)?(?:(?:www|m)\.)?(?:youtu\.be\/|youtube(?:-nocookie)?\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((\w|-){11})(?:\S+)?$
    

    Regexper:

    http://regexper.com/#%5E(%3F%3Ahttps%3F%3A%5C%2F%5C%2F)%3F(%3F%3A(%3F%3Awww%7Cm)%5C.)%3F(%3F%3Ayoutu%5C.be%5C%2F%7Cyoutube(%3F%3A-nocookie)%3F%5C.com%5C%2F(%3F%3Aembed%5C%2F%7Cv%5C%2F%7Cwatch%5C%3Fv%3D%7Cwatch%5C%3F.%2B%26v%3D))((%5Cw%7C-)%7B11%7D)(%3F%3A%5CS%2B)%3F%24
    

答案 5 :(得分:1)

 /* test youtube */
 var src = "https://www.youtube.com/watch?v=HCPLKrRguDM";
  regExTestYT(src);
   function regExTestYT(str){
   var exp = new RegExp(/(youtu\.be|youtube\.com)/);
   return exp.test(str); 
  }

答案 6 :(得分:-2)

function get_youtube_video_id_from_url(url){
    var code = url.match(/v=([^&#]{5,})/)
    return (typeof code[1] == 'string') ? code[1] : false;
}

答案 7 :(得分:-4)

function validYT(url) {
  var p = /^(?:https?:\/\/)?(?:www\.)?youtube\.com\/watch\?(?=.*v=((\w|-){11}))(?:\S+)?$/;
  return (url.match(p)) ? RegExp.$1 : false;
}