我正在使用以下方法来验证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。