使用RegexvalidationURL /域? (导轨)
我正在尝试创建一个validation,检查以确保域/ URL有效,例如“test.com”
def valid_domain_name? domain_name = domain.split(".") name = /(?:[A-Z0-9\-])+/.match(domain_name[0]).nil? tld = /(?:[AZ]{2}|aero|ag|asia|at|be|biz|ca|cc|cn|com|de|edu|eu|fm|gov|gs|jobs|jp|in|info|me|mil|mobi|museum|ms|name|net|nu|nz|org|tc|tw|tv|uk|us|vg|ws)/.match(domain_name[1]).nil? if name == false or tld == false errors.add(:domain_name, 'Invalid domain name. Please only use names with letters (AZ) and numbers (0-9).') end end
这是我到目前为止所做的,但它不起作用。 它可以让错误的URL通过而不会失败。
我不太了解正则表达式。
偶然发现:
validates_format_of :domain_name, :with => /^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[az]{2,5}(:[0-9]{1,5})?(\/.*)?$/ix
仅供参考: Rubular是测试Ruby正则表达式的绝佳资源
@Tate的答案适用于完整的URL,但如果要validationdomain
列,则不希望允许其正则表达式允许的额外URL位(例如,您绝对不希望允许带有路径的URL一份文件)。
所以我删除了正则表达式的协议,端口,文件路径和查询字符串部分,结果如下:
^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[az]{2,5}$
查看两个版本的相同测试用例。
- 原始(允许域名或完整url): http : //rubular.com/r/qGInC06jcz
- 修改( 仅允许域): http : //rubular.com/r/yP6dHFEhrl
^(http|https):\/\/|[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[az]{2,6}(:[0-9]{1,5})?(\/.*)?$/ix
- example.com
- sub.example.com
- sub.domain.my-example.com
- example.com/?stuff=true
- example.com:5000/?stuff=true
- sub.domain.my-example.com/path/to/file/hello.html
- hello.museum
- http://railsgirls.com
http://rubular.com/r/cdkLxAkTbk
添加了可选的http://或https://
最长的TLD是.museum
,有6个字符……
在Rails中进行URLvalidation的另一种方法是
validates :web_address, :format => { :with => URI::regexp(%w(http https)), :message => "Valid URL required"}
自Ruby 1.8.6以来更好的答案
require 'uri' def valid_domain_name?(domain_name) domain_name =~ URI::regexp(%w(http https)) end
对我有用的是
def validate_url(text) uri = URI.parse(text) raise URI::InvalidURIError unless uri.kind_of?(URI::HTTP) || uri.kind_of?(URI::HTTPS) rescue URI::InvalidURIError errors.add(:url, 'is invalid') end end
我拿走你所拥有的并修改它以便我可以使http://
或https://
可选:
/^((http|https):\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[az]{2,5}(:[0-9]{1,5})?(\/.*)?$/ix
根据谷歌 ,这个很好地工作:
/^([a-z0-9]([-a-z0-9]*[a-z0-9])?\\.)+((a[cdefgilmnoqrstuwxz]|aero|arpa)|(b[abdefghijmnorstvwyz]|biz)|(c[acdfghiklmnorsuvxyz]|cat|com|coop)|d[ejkmoz]|(e[ceghrstu]|edu)|f[ijkmor]|(g[abdefghilmnpqrstuwy]|gov)|h[kmnrtu]|(i[delmnoqrst]|info|int)|(j[emop]|jobs)|k[eghimnprwyz]|l[abcikrstuvy]|(m[acdghklmnopqrstuvwxyz]|mil|mobi|museum)|(n[acefgilopruz]|name|net)|(om|org)|(p[aefghklmnrstwy]|pro)|qa|r[eouw]|s[abcdeghijklmnortvyz]|(t[cdfghjklmnoprtvwz]|travel)|u[agkmsyz]|v[aceginu]|w[fs]|y[etu]|z[amw])$/i
有点冗长……
它不区分大小写…它看起来不像你的正则表达式,但我不知道Ruby。 或许你早些时候把它们大写了。
我喜欢这个用于validationURL的插件: https : //github.com/henrik/validates_url_format_of/tree
使用上面的Brian Ray的回答,我认为回答问题(域不是url)并为Rails 4更新它。
/\A[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[az]{2,5}\z/ix
尝试调整模式,使它们以^开头(以“开头”字符开头),以$结尾(“以…结尾”),以便整个模式读取“以此开头然后结束的字符串”,否则匹配名称,比方说,如果找到模式,则匹配为正数(即有一个正确的字符。)
^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,6}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,3})$
使用RegEx进行域名validation
这是我的URLvalidation器,使用Ruby的内置解析器
class UrlValidator < ActiveModel::EachValidator def validate_each(record, attribute, value) p = URI::Parser.new valid = begin p.parse(value) true rescue false end unless valid record.errors[attribute] << (options[:message] || "is an invalid URL") end end end