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

Ste*_*eve 1 regex validation activerecord ruby-on-rails

我正在使用正则表达式将 YouTube 视频嵌入到我的应用程序中。该视频由用户提供,我想在将其存储在数据库中之前验证此输入。我正在尝试使用相同的正则表达式来做到这一点,但遇到了一些问题。如果正则表达式之一匹配,我的预期功能是验证为真。

validates_format_of :video_link, :with => /youtu\.be\/([^\?]*)/ || /^.*((v\/)|(embed\/)|(watch\?))\??v?=?([^\&\?]*).*/
Run Code Online (Sandbox Code Playgroud)

这是我认为可行的方法,但事实并非如此,它拒绝了我迄今为止的所有输入

validates_format_of :video_link, :with => /youtu\.be\/([^\?]*)/ && /^.*((v\/)|(embed\/)|(watch\?))\??v?=?([^\&\?]*).*/
Run Code Online (Sandbox Code Playgroud)

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

mu *_*ort 5

这个表达:

/youtu\.be\/([^\?]*)/ || /^.*((v\/)|(embed\/)|(watch\?))\??v?=?([^\&\?]*).*/
Run Code Online (Sandbox Code Playgroud)

计算为第一个正则表达式,因为正则表达式对象在布尔上下文中为真,因此:

:with => /youtu\.be\/([^\?]*)/ || /^.*((v\/)|(embed\/)|(watch\?))\??v?=?([^\&\?]*).*/
Run Code Online (Sandbox Code Playgroud)

相当于:

:with => /youtu\.be\/([^\?]*)/
Run Code Online (Sandbox Code Playgroud)

这个表达:

/youtu\.be\/([^\?]*)/ && /^.*((v\/)|(embed\/)|(watch\?))\??v?=?([^\&\?]*).*/
Run Code Online (Sandbox Code Playgroud)

计算为第二个正则表达式,因此:

:with => /youtu\.be\/([^\?]*)/ && /^.*((v\/)|(embed\/)|(watch\?))\??v?=?([^\&\?]*).*/
Run Code Online (Sandbox Code Playgroud)

相当于:

:with => /^.*((v\/)|(embed\/)|(watch\?))\??v?=?([^\&\?]*).*/
Run Code Online (Sandbox Code Playgroud)

我认为您只想将两个正则表达式与交替运算符合并为一个:

:with => /youtu\.be\/([^\?]*)|^.*((v\/)|(embed\/)|(watch\?))\??v?=?([^\&\?]*).*/
#----------------------------^
Run Code Online (Sandbox Code Playgroud)

您还可以考虑跳过正则表达式验证器或使用URI.parse用于分离 URL的简单 Ruby 方法,然后您可以单独检查主机名、路径和 CGI​​ 参数,而无需尝试将它们全部塞入正则表达式中。

  • 如果您想将它们分开放置,您也可以执行 Regexp.union(first_regexp, second_regexp) 以编程方式加入它们。 (8认同)