我想有一种方法来确定输入是否是域。
示例输入:
@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 @ 内容)