正则表达式 Youtube 视频链接

4

我正在使用这个正则表达式来验证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 地址。

我正在寻找一个解决方法。

6个回答

9

不要在第一个问号后再出现另一个问号:

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

在查询参数中,实际的 ? 应该被转义,这样做的方法就不会排除任何有效的URL。

谢谢,伙计!那真的很简单... :) 我当时太生气了,以至于连想都没想到... :) - TriNitroToluene

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

应该可以解决问题!在实际匹配剩余字符串之前使用负向先行断言。 :)

1
如果您只关心双重粘贴,那么可以尝试使用此正则表达式(基于 don @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/

1

1

关于什么?

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

在Regexr上这里查看

我将最后一部分(?:\S+)?改为(?:(?:\S(?!http))+)?,这意味着只有当下一个非空白字符(\S)不是跟随着“http”((?!http))时才匹配。


为什么不直接重复YouTube的部分呢?像这样:^http:\/\/(?:www\.)?youtube\.com\/watch\?(?=.*v=\w+)(?:(?:\S(?!http:\/\/(?:www\.)?youtube\.com))+)?$ - fncomp
@josh 是因为它太长了吗?不是的,有很多组合可以实现这个目标,可能最好在我的前瞻中添加 ://。顺便说一下,你的代码不起作用,我把它放到 Regexr 链接中,它还匹配了重复的地址。(不知道为什么) - stema
哎呀,我错过了一点。这个更有意义,对我来说:^http:\/\/(?:www\.)?youtube.com\/watch\?(?=.*v=\w+)(?:(?:\S(?!.{0,}youtube\.com.{0,}))+)?$。我猜我会单独发布一个答案。 - fncomp
大家好, 还有另一部分。Youtube不关心重复的URL,它只需要视频的11位数字ID。无论如何,感谢你们的回答... :) 有适当的验证总是很好的。 - TriNitroToluene

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接