2011-11-29 110 views
4

我使用这个正则表达式来验证youtube网址。正则表达式YouTube网址

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

它很好用。

但我有这个问题。

如果用户输入http://www.youtube.com/watch?v=zcKEjSYJVLs&feature=topvideos_sports它工作正常

现在我想避免粘贴多次(三次在我们的例子)本

http://www.youtube.com/watch?v=zcKEjSYJVLs&feature=topvideos_sportshttp://www.youtube.com/watch?v=zcKEjSYJVLs&feature=topvideos_sportshttp://www.youtube.com/watch?v=zcKEjSYJVLs&feature=topvideos_sports 

相同的URL。对于这个正则表达式,它也是一个有效的youtube地址。

我正在寻找解决方法。

回答

7

不要让?后的第一个:

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

查询参数的实际?应该逃脱,所以这种做法不应排除任何有效的URL。

+0

谢谢你!这真的很简单...... :)我很生气,我什至不能想到.. :) – TriNitroToluene

1

什么

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

看到它here on Regexr

我改变了最后一部分(?:\S+)?(?:(?:\S(?!http))+)?这意味着,匹配下一个非空白字符(\S)只有当它的后面没有“HTTP”( (?!http)

+0

为什么不只是重复youtube位?像:'^ http:\/\ /(?: www \。)?youtube \ .com \/watch \?(?=。* v = \ w +)(?:(?:\ S(?!http: \/\ /(?: www \。)?youtube \ .com))+)?'' – fncomp

+0

@josh因为它这么久?没有什么,有很多组合可以实现这一点,可能在我的前瞻中添加'://'是很好的选择。顺便说一句,你的不工作,我把它放入Regexr链接,它的匹配也是重复的地址。 (不知道为什么) – stema

+0

糟糕,我错过了那里。这实际上对我更有意义:'^ http:\/\ /(?: www \。)?youtube.com \/watch \?(?=。* v = \ w +)(?:(?:\ S (?!{0,}的YouTube \ .COM。{0,}))+)?$'。猜猜我会作为一个单独的答案发布。 – fncomp

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

应该做的伎俩!

在实际匹配字符串上留下的内容之前使用负向预测。 :)

1

如果你只关心一个双贴那么也许尝试这个表达式(基地唐@ STEMA的答案):

^http:\/\/(?:www\.)?youtube\.com\/watch\?(?=.*v=\w+)(?:(?:\S(?!.{0,}youtube\.com‌​.{0,}))+)?$ 
1

Ruby on Rails的4抱怨使用^和$,因为可能的脚本注入的可能性。在这里它被编辑,以避免该警告以及也接受https

/\Ahttps?:\/\/(?:www\.)?youtube.com\/watch\?(?=.*v=\w+)(?:\S+)?\z/