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)
这就是我现在拥有的并且正在运行(据我所知没有错误)。我认为这行不通,因为两个正则表达式都必须匹配才能通过验证。为什么会这样?提前致谢。
这个表达:
/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 参数,而无需尝试将它们全部塞入正则表达式中。
| 归档时间: |
|
| 查看次数: |
2256 次 |
| 最近记录: |