我想从网址中提取顶级域名: 日志是这样的:
<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
任何人都可以帮我解决这个问题。
由于
答案 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。