validates_format_of:with =>多个正则表达式

时间:2011-12-11 04:10:02

标签: ruby-on-rails regex validation activerecord

我正在使用正则表达式将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?=?([^\&\?]*).*/

这就是我现在所拥有的并且它正在发挥作用(据我所知,没有错误)。我认为这不起作用,因为两个正则表达式都必须匹配验证才能通过。为什么会这样?提前谢谢。

1 个答案:

答案 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参数,而不必尝试将其全部阻塞进入正则表达式。