确定输入是否为域

时间:2011-05-08 17:25:29

标签: ruby-on-rails ruby regex ruby-on-rails-3

我想知道输入是否是一个域。

示例输入:

@stackexchange.com
@gmail.com
@google

逻辑:

1. First determine if the first character is an @
2. If the input ends in a domain ext, .X or .XX or .XXX
3. Then determine if the domain (stackexchange, gmail, google) are not blacklisted. For example I might want to blacklist gmail.

关于如何做到这一点的建议?它会存在于控制器或模型中吗?正则表达式是正确的方法,还是会减慢?感谢

思路:

1. Use params[:q][0,1]

3 个答案:

答案 0 :(得分:2)

与电子邮件地址非常相似,域名可能看起来是正确的,但无法通过最基本的测试,即无法访问或连接的域名。

如果您正在寻找电子邮件地址,可以查看@,但这并不能告诉您它是否是域名。域没有@个标志。

域至少有一个.,例如.com。他们有一个已知的TLD,即顶级域名,即.com.me.info。顶级域名(TLD)的问题在于它们正在向人们想要的东西开放,因此很快就会很难进行简单的查找。

在我看来,最好的办法是尝试通过ping,电子邮件和http连接来连接它。这些是最有可能的服务。次要选择是尝试使用以下内容解析域:

host example.com

将返回:

example.com has address 192.0.32.10
example.com has IPv6 address 2620:0:2d0:200::10

使用%x{}或反引号进行调用。

阅读维基百科上的“Domain Name Syntax”描述可能有助于概述域名的定义,特别是:

  

DNS名称在技术上可以由八位字节中可表示的任何字符组成。但是,允许在DNS根区域和大多数其他子域中配置域名使用首选格式和字符集。标签中允许的字符是ASCII字符集的子集,包括字符a到z,A到Z,数字0到9以及连字符。此规则称为LDH规则(字母,数字,连字符)。域名以与案例无关的方式解释。标签不得以连字符开头或结尾。

RFC 3696 - Application Techniques for Checking and Transformation of Names会为您提供完整的规则。

答案 1 :(得分:1)

正则表达式正是您所寻找的。对于前面带@的域,它将类似于:

possible_domain =~ /\A@([-_a-zA-Z0-9]+\.[a-z]{1,3})\Z/
domain_to_check_against_a_blacklist = $1

你想用它做什么?保存,只有在有效时?然后,您应该查看validationsvalidates_format_of

答案 2 :(得分:0)

我会坚持http://www.regular-expressions.info/email.html(只是省略pre @ stuff)