【问题标题】:Regex to extract the top level domain from a URL正则表达式从 URL 中提取顶级域
【发布时间】:2018-01-04 22:04:24
【问题描述】:

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

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

 

我只想获取顶级域:

ddns

我试过这个正则表达式

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

但我得到了

xxxxx.ddns

【问题讨论】:

    标签: regex url


    【解决方案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@:%_\+.~#?&amp;\/\/=]*) - 这是正则表达式的其余部分,应该匹配端口和/或 URL 的其余部分 (/example/page/)。

    还需要指出的是,如果您使用 SLD 和 ccTLD(国家代码 TLD)“组合”测试域,则此正则表达式将不匹配,例如:.co.uk.co.it,两者都只是结尾但是,对于商业网站和一般网站,两者都将返回 co 作为 SLD。

    【讨论】:

    • 这在很多情况下都失败了。
    猜你喜欢
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多