正则表达式 - 提取域名和TLD

时间:2012-02-13 20:16:38

标签: regex

我正在尝试从字符串中提取域名和TLD(如果存在)。

对于“testing.co.uk”我想要一个包含值的数组:(“testing”,“co.uk”)

对于“-testing.c”我想要一个带有值的数组:(“testing”)

对于“test-ing.co.uk.com”我想要一个带有值的数组(“test-ing”,“co.uk”)

规则很简单:

  • 域名的第一个和最后一个字符不能是“ - ”
  • TLD必须至少包含两个字符
  • TLD部分可能有一个点字符“。”但只有当后面至少有两个字母

我有这个:

  • (\w[-\w]*\w) - 提取域名的第一部分(工作)
  • \.(\w{2,}(\.?\w{2,})?) - 获取TLD(不工作)

2 个答案:

答案 0 :(得分:4)

如果我们可以假设TLD最多有2个子部分,则在字符串的末尾(最后一个部分始终是TLD的一部分),并且中间部分的长度在2到3个字符之间。字符串中至少有一个不属于TLD的子部分,则以下内容应与大多数情况相匹配。您对在中间需要所有字母数字和短划线的域的假设是正确的。每个段只能有63个字符长。

^((?:www\.)?(?:\w[-\w]{0-61}\w|\w)(?:\.\w[-\w]{0-61}\w|\w)*?)\.((?:\w{2-3}\.)?\w+))$

解释:

(?: )表示非捕获匹配,您可以使用+,* ,?在它上面但它不会在你的答案中返回

^$分别匹配字符串的开头和结尾(

{n-m}类似于*或+但匹配特定数量的字符

*?表示匹配0或更多匹配,但非贪婪,因此匹配有效匹配所需的最少次数。这意味着可能由正则表达式任何一方匹配的子部分将进入顶级域名。

(?:www\.)?这是短域名的错误修正,例如www.un.org

(?:\w[-\w]{0-61}\w|\w)确保域部分中至少有一个子部分,并且每个部分最多为63个字符(61 + 2 = 63)。子部分由外部括号捕获。最后的| \ w位解决了一个字母域名的边缘情况,例如x.org和i.net。

(?:\.\w[-\w]{0-61}\w)*?|\w)需要重复,因为第一个小节不能以点开头。这些中的零个或多个是必需的,但要使其成为非贪婪的搜索。

((?:\w{2-3}\.)?\w+)根据上述规则与TLD相匹配。最后一小节始终是TLD的一部分。关于什么构成二级TLD的规则更加模糊

此正则表达式并非完全万无一失,因为有一些例外违反了上述规则。 www.un.com是具有短域名的单段TLD的一个示例。 gmp.police.uk(大曼彻斯特警察局)是另一个域名的例子,其中TLD(police.uk)将无法正确匹配(它将与英国匹配)。

我已将TLD细分受众群的长度扩展为{2-4},因为我们需要包含.info和.mod.uk等域名。我已将第二个TLD段的长度减少到{2-3},以减少四个字母域名的不匹配数量,我们对两个或三个字母的域名做的不多,但只有两者不匹配该域还包含一个子域,例如blog.cat.com

以下列出了一些已经使用的顶级域名(TLD),这些顶级域名可能会突出显示一些边缘案例。我认为没有任何内容 http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains
http://en.wikipedia.org/wiki/.uk

答案 1 :(得分:-8)

从网址中删除http://https://后,这对我有用:

(?:www\.)?((?!-)[a-zA-Z0-9-]{2,63}(?<!-))\.?((?:[a-zA-Z0-9]{2,})?(?:\.[a-zA-Z0-9]{2,})?)

我一次检查一个网址,如果它返回两个匹配,我认为它有效(因为我没有正则表达式技能在那里进行相同的检查)。

在此处试试:http://rubular.com/r/CXmWlSuikP

编辑:没有反馈的投票无法帮助此社区中的任何人。如果此答案不适合您的具体案例,请发表评论。如果您找到问题的解决方案,请将其作为答案发布。