我正在使用正则表达式将YouTube视频嵌入到我的应用中。视频由用户提供,我想在输入存储到数据库之前对其进行验证。我正在尝试使用相同的正则表达式,但遇到了一些问题。我的预期功能是,如果其中一个正则表达式匹配,则验证为真。
validates_format_of :video_link, :with => /youtu\.be\/([^\?]*)/ || /^.*((v\/)|(embed\/)|(watch\?))\??v?=?([^\&\?]*).*/
这是我认为可行的,但事实并非如此,它否认了迄今为止我输入的所有内容
validates_format_of :video_link, :with => /youtu\.be\/([^\?]*)/ && /^.*((v\/)|(embed\/)|(watch\?))\??v?=?([^\&\?]*).*/
这就是我现在所拥有的并且它正在发挥作用(据我所知,没有错误)。我认为这不起作用,因为两个正则表达式都必须匹配验证才能通过。为什么会这样?提前谢谢。
答案 0 :(得分:3)
这个表达式:
/youtu\.be\/([^\?]*)/ || /^.*((v\/)|(embed\/)|(watch\?))\??v?=?([^\&\?]*).*/
计算到第一个正则表达式,因为在布尔上下文中正则表达式对象为true,所以这个:
:with => /youtu\.be\/([^\?]*)/ || /^.*((v\/)|(embed\/)|(watch\?))\??v?=?([^\&\?]*).*/
相当于:
:with => /youtu\.be\/([^\?]*)/
这个表达式:
/youtu\.be\/([^\?]*)/ && /^.*((v\/)|(embed\/)|(watch\?))\??v?=?([^\&\?]*).*/
评估第二个正则表达式,所以:
:with => /youtu\.be\/([^\?]*)/ && /^.*((v\/)|(embed\/)|(watch\?))\??v?=?([^\&\?]*).*/
相当于:
:with => /^.*((v\/)|(embed\/)|(watch\?))\??v?=?([^\&\?]*).*/
我认为您只想将两个正则表达式与一个交替运算符组合成一个:
:with => /youtu\.be\/([^\?]*)|^.*((v\/)|(embed\/)|(watch\?))\??v?=?([^\&\?]*).*/
#----------------------------^
您可能还会考虑使用正则表达式验证器或使用URI.parse
将URL拉开的简单Ruby方法,然后您可以单独检查主机名,路径和CGI参数,而不必尝试将其全部阻塞进入正则表达式。