我正在尝试从字符串中提取域名和TLD(如果存在)。
对于“testing.co.uk”我想要一个包含值的数组:(“testing”,“co.uk”)
对于“-testing.c”我想要一个带有值的数组:(“testing”)
对于“test-ing.co.uk.com”我想要一个带有值的数组(“test-ing”,“co.uk”)
规则很简单:
我有这个:
(\w[-\w]*\w)
- 提取域名的第一部分(工作)\.(\w{2,}(\.?\w{2,})?)
- 获取TLD(不工作)答案 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
编辑:没有反馈的投票无法帮助此社区中的任何人。如果此答案不适合您的具体案例,请发表评论。如果您找到问题的解决方案,请将其作为答案发布。