Javascript / Regex只用于查找没有子域的根域名

时间:2010-08-09 12:13:59

标签: javascript regex dns

我进行了搜索,发现了许多类似的正则表达式示例,但不是我需要的。

我希望能够传递以下网址并返回结果:

  • www.google.com 返回 google.com

  • sub.domains.are.cool.google.com 返回 google.com

  • doesntmatterhowlongasubdomainis.idont.wantit.google.com 返回 google.com

  • sub.domain.google.com/no/thanks 返回 google.com

希望有道理:) 在此先感谢!-James

5 个答案:

答案 0 :(得分:10)

您不能使用正则表达式执行此操作,因为您不知道后缀中有多少个块。

例如 google.com 的后缀为 com 。要从 subdomain.google.com 转到 google.com ,您必须使用最后两个区块 - 一个用于后缀,一个用于 google

如果您将此逻辑应用于 subdomain.google.co.uk ,但最终会使用 co.uk

您实际上需要从http://publicsuffix.org/

这样的列表中查找后缀

答案 1 :(得分:7)

不要使用正则表达式,使用.split()方法并从那里开始工作。

var s = domain.split('.');

如果您的用例相当狭窄,您可以根据需要检查TLD,然后根据需要返回最后2或3个段:

return s.slice(-2).join('.');

它会使你的眼睛流血少于任何正则表达式解决方案。

答案 2 :(得分:1)

我没有对此做过很多测试,但如果我明白你的要求,这应该是一个不错的起点......

([A-Za-z0-9-]+\.([A-Za-z]{3,}|[A-Za-z]{2}\.[A-Za-z]{2}|[A-za-z]{2}))\b

修改

澄清一下,它正在寻找:

一个或多个字母数字字符或短划线,后跟一个文字点

然后是三件事之一...

  1. 三个或更多字母字符(即com / net / mil / coop等)
  2. 两个字母字符,后跟一个字面点,然后是两个字母(即co.uk)
  3. 两个字母字符(即us / uk / to等)
  4. 并且在结尾处,单词边界(\ b)表示字符串,空格或非单词字符的结尾(正则表达字中的字符通常是字母数字和下划线)。

    正如我所说,我没有做太多测试,但这似乎是一个合理的跳跃点。您可能需要尝试并对其进行一些调整,即使这样,您也不可能获得100%的所有测试用例。有一些考虑因素,比如Unicode域名和各种技术上有效但但你很可能不会遇到的东西会像这样惹起一个简单的正则表达式,但这可能会得到你在那里90%以上。

答案 3 :(得分:0)

如果您的数据子集有限,我建议保持正则表达式简单,例如

(([a-z\-]+)(?:\.com|\.fr|\.co.uk))

这将匹配:

www.google.com --> google.com
www.google.co.uk --> google.co.uk
www.foo-bar.com --> foo-bar.com

就我而言,我知道使用此正则表达式将匹配所有相关的URL。

收集样本数据集并针对正则表达式进行测试。在进行原型设计时,您可以使用https://regex101.com/r/aG9uT0/1等工具来实现。在开发中,使用测试脚本自动化它。

答案 4 :(得分:0)

在不测试顶级域有效性的情况下,我使用的是Stormsweeper解决方案的改编:

domain = 'sub.domains.are.cool.google.com'

s = domain.split('.')

tld = s.slice(-2..-1).join('.')