我想知道输入是否是一个域。
示例输入:
@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]
答案 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
你想用它做什么?保存,只有在有效时?然后,您应该查看validations和validates_format_of。
答案 2 :(得分:0)
我会坚持http://www.regular-expressions.info/email.html(只是省略pre @ stuff)