我正在使用以下方法来验证URL的格式是否有效:

validates_format_of :website, :with => URI::regexp(%w(http https))

但是,当网址不是以http://https://开头时,该功能将不起作用。是否有一些类似的方法可以使用URI::regexp(或URI)验证URL,并使其包含不以http://开头的有效URL? (例如,www.google.com是有效的,http://www.google.com也是有效的)

最佳答案

This post on Daring Fireball提供了一个强大的正则表达式:

\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))

A more recent post对此进行了改进(为清楚起见,在此处添加了换行符和缩进;为获得更多扩展的版本以及说明,请参见该帖子):
(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|
           www\d{0,3}[.]|
           [a-z0-9.\-]+[.][a-z]{2,4}/)
       (?:[^\s()<>]+|
          \(([^\s()<>]+|
          (\([^\s()<>]+\)))*\))+
       (?:\(([^\s()<>]+|
          (\([^\s()<>]+\)))*\)|
          [^\s`!()\[\]{};:'".,<>?«»“”‘’]))

根据我的测试,URL::regexp是URI定义的松散(尽管它确实需要http…)。

如有必要,您可以使用虚拟属性或before_save过滤器将http://附加到您的URL。

09-25 17:43
查看更多