2010-08-09 97 views
10

我有一个搜索,发现很多类似的正则表达式的例子,但不是我所需要的。Javascript /正则表达式找到没有子域的根域名

我希望能够在下面的网址,传递并返回结果:

  • 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

希望是有道理的:) 在此先感谢! - 詹姆斯

+11

“sub.domain.google.co.uk”的结果是什么? – 2010-08-09 12:15:24

+3

这些不是URL,只是域名(除了最后一个字符串可以解释为域名和URL路径)。 – Gumbo 2010-08-09 12:15:43

+0

@pekka“google.co.uk”as apps.facebook.com return facebook.com。 @gumbo这是正确的。它们只是可以传入的例子。大多数情况下,它们都是完整的url(子域,域,文件夹,文件)。 – jamesmhaley 2010-08-09 12:20:16

回答

10

你不能用正则表达式来做到这一点,因为你不知道后缀中有多少块。

例如谷歌。com有一个后缀com。要从subdomain.google.comgoogle.com您必须采取最后两个块 - 一个用于后缀,另一个用于谷歌

如果应用此逻辑subdomain.google.co.uk虽然你将与co.uk结束。

你实际上需要从列表中查找后缀像http://publicsuffix.org/

0

我还没有做过很多测试,b UT如果我知道你要问什么,这应该是一个不错的起点......

([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等) )

在结尾处,字边界(\ b)表示字符串末尾,空格或非单词字符(在正则表达式中,单词字符通常是字母数字和下划线)。

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

+0

你能解释一下吗?我对正则表达式的理解很少。以及如何实施。 – jamesmhaley 2010-08-13 15:29:48

+1

90%是慷慨的。基本上,没有简单的方法来做到这一点。域名系统过于复杂,允许有很多变化。 – hallvors 2010-09-22 00:37:36

+1

鉴于提供的例子是“非常规”的外观领域,我认为你可能会遇到很大的问题,但肯定的是,也许不是90%。正如我刚才所说(并且真正到了这一点),你不可能在所有的测试用例中获得100%的回报。 – theraccoonbear 2010-09-23 23:26:07

6

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

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

如果你的使用情况是相当狭窄的,那么你可以检查的顶级域名需要,然后返回最后2个或3段酌情:

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

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

+2

不适用于网址bbc.co.uk – didxga 2016-05-31 10:40:12

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这样的工具来完成这项工作。在开发中,使用测试脚本自动化它。