正则表达,匹配什么或什么都没有?

时间:2011-06-09 02:47:56

标签: regex

我正在尝试使用正则表达式来嵌入YouTube视频。

现在,这是我的基本工作:

http:\/\/www\.youtube\.com\/watch\?.*v=([a-z0-9-_]+)

它具有正常的,已识别的YouTube网址,然后匹配唯一的视频代码。不幸的是,这证明了对我的用户提出太多要求。他们输入它缺少HTTP,缺少WWW,缺少HTTP和WWW,有时他们输入它替换/ watch?v = * with / v / *并且在所有这些情况下它都会破坏格式..

我想要做的是允许“youtube.com”之前和之后的任何内容,以便无论输入如何,它都将接近完美。以下示例..

http://www.youtube.com/watch?v=([a-z0-9-_]+) --- the normal, unmolested input
http://youtube.com/watch?v=([a-z0-9-_]+) --- missing WWW
www.youtube.com/watch?v=([a-z0-9-_]+) --- missing HTTP
youtube.com/watch?v=([a-z0-9-_]+) --- missing HTTP and WWW
http://www.youtube.com/v/([a-z0-9-_]+) --- substituted watch?v= for /v/
http://youtube.com/v/([a-z0-9-_]+) --- substituted watch?v= for /v/ AND missing WWW 
www.youtube.com/v/([a-z0-9-_]+) --- substituted watch?v= for /v/ AND missing HTTP
youtube.com/v/([a-z0-9-_]+) --- substituted watch?v= for /v/ AND missing HTTP and WWW

这是一个我认为应该有效的改动(允许任何角色),但也许我错过了什么?

[.]+\youtube\.com\/[.]+([a-z0-9-_]+)

如果我模糊或无知,我道歉,但是我尝试了几次改动而且从未奏效。也许我正在寻找的是不可能的。我老老实实地试过了解正则表达式,也许是时间,也许只是我,但我无法破译它。从我的角度来看,它已经超出了神秘面纱。

我真诚地感谢那些不遗余力的人......

2 个答案:

答案 0 :(得分:3)

应该这样做......

(?:http://)?(?:www\.)?youtube\.com/(?:watch\?v=|v/)([\w-]+)

RegExr

这将匹配网址,并将YouTube视频ID设置为捕获组1。

匹配可能的http://,然后匹配www.,然后始终youtube.com/,然后匹配watch?v=v/,然后匹配{ {1}}字符类和\w

答案 1 :(得分:0)

在字符类中,.不是特殊字符,它实际上是一个点。 [.]+因此意味着“一个或多个点”。我不知道你可能遇到的任何其他问题,但它应该是.+(或者可能.*,因为“youtube”可以是字符串的开头)。