轨道上的红宝石 - 确定输入是否为域



我想有一种方法来确定输入是否是域。

示例输入:

@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]

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

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

域至少有一个.,例如.com。他们有一个已知的顶级域名,又名顶级域名,即.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{}或反引号调用它。

阅读维基百科上的"域名语法"描述可能会有所帮助,以了解域名的定义概述,特别是:

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

RFC 3696 - 检查和转换名称的应用技术将为您提供完整的规则。

正则表达式就是你要找的。对于前面有@的域,它将是这样的:

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

你想用它做什么?保存它,仅在它有效时?然后,您应该查看验证和validates_format_of。

我会坚持使用 http://www.regular-expressions.info/email.html(只需省略 pre @ 内容)

相关内容

  • 没有找到相关文章

最新更新