正则表达式从URL中提取顶级域名

时间:2017-07-28 18:31:44

标签: regex url logging extract

我想从网址中提取顶级域名: 日志是这样的:

<182>Jul 28 13:52:34 PROXYSQUID1 logger: 1501249953.155      0 192.168.4.27 TCP_MISS/503 2408 POST http://xxxxx.ddns.net:1220/is-ready - DIRECT/154.68.5.134 text/html

我想只获得顶级域名:

ddns

我试过这个正则表达式

([\da-z\.-]+)\.([a-z\.])

但我得到了

xxxxx.ddns

任何人都可以帮我解决这个问题。

由于

1 个答案:

答案 0 :(得分:1)

你在这里误解了这些词...... TLD(顶级域名)指的是域名的最后一段或紧跟在“点”符号后面的部分。 (例如:.com.net等。)

您要搜索的是second level domain(或SLD)。

我已针对您的问题修改了 Daveo's answer ,因此匹配将返回到第一个捕获组:

(?:[-a-zA-Z0-9@:%_\+~.#=]{2,256}\.)?([-a-zA-Z0-9@:%_\+~#=]*)\.[a-z]{2,6}\b(?:[-a-zA-Z0-9@:%_\+.~#?&\/\/=]*)

以下是演示:https://regex101.com/r/x2luiO/1

<强>解释

  • (?:[-a-zA-Z0-9@:%_\+~.#=]{2,256}\.)? - 第一部分将在您的SLD(子域名)之前获取所有内容。
  • ([-a-zA-Z0-9@:%_\+~#=]*) - 这是您的捕获组(应返回域名)
  • \.[a-z]{2,6} - 这将匹配TLD(如果您还想捕获)
  • \b(?:[-a-zA-Z0-9@:%_\+.~#?&\/\/=]*) - 这是正则表达式的其余部分,应该匹配端口和/或URL的其余部分(/example/page/)。

如果您使用SLD和ccTLD(国家/地区代码顶级域名)'组合'测试域名,例如:.co.uk.co.it,这两个正则表达式都不匹配只是商业和一般网站的域名结束,但是,两者都将返回co作为SLD。