从Google表格中的网址字符串中提取根域名

snh*_*_nl 10 spreadsheet google-sheets web

您好我正在尝试从Google表格中的URL字符串中提取根域.我知道如何获取域名,我有删除的公式,www.但现在我意识到它不会删除子域前缀,如'mysite'.site.com; 哪里mysite没有从域名中删除.

问:我怎样才能检索domain.com rootdomain其中域串接触字母数字字符,然后1点,然后字母数字字符(仅此而已)

目前在Google表格中的公式:

=REGEXREPLACE(REGEXREPLACE(D3923;"(http(s)?://)?(www\.)?";"");"/.*";"")
Run Code Online (Sandbox Code Playgroud)

也许这可以简化......

测试用例

    https://www.domain.com/ => domain.com
    https://domain.com/ => domain.com
    http://www.domain.nl/ => domain.com
    http://domain.de/ => domain.com
    http://www.domain.co.uk/ => domain.co.uk
    http://domain.co.au/ => domain.co.au
    sub.domain.org/ => sub.domain.com
    sub.domain.org => sub.domain.com
    domain.com => domain.com
    http://www.domain.nl?par=1  => domain.com
    https://www.domain.nl/test/?par=1  => domain.com
    http2://sub2.startpagina.nl/test/?par=1  => domain.com
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

snh*_*_nl 17

目前使用:

=trim(REGEXEXTRACT(REGEXREPLACE(REGEXREPLACE(A2;"https?://";"");"^(w{3}\.)?";"")&"/";"([^/?]+)"))

似乎工作正常

更新日期:2016年7月7日

(感谢所有的帮助!)

  • 老实说,我不知道这是否会更有效,但是我猜它只使用一个函数:`= REGEXEXTRACT(“。”&B1&“ /”,“ \。([^。] + \。[^ ./?]+)(?:/ | \?)“)` (3认同)

Igo*_*kin 5

我认为最可靠的方法是检查 TLD 列表,因为像 co.uk、gov.uk 等 TLD 无法通过简单的正则表达式提取。

您可以在“工具”->“脚本编辑器”中定义这些函数

function endsWith(str, searchString) {
    position = str.length - searchString.length;
    var lastIndex = str.lastIndexOf(searchString);
    return lastIndex !== -1 && lastIndex === position;
}

function rawToTlds(raw) {
    var letter = new RegExp(/^\w/);
    return raw.split(/\n/).filter(function (t) { return letter.test(t) })
}

function compressString(s) {
    var zippedBlob = Utilities.gzip(Utilities.newBlob(s))
    return Utilities.base64Encode(zippedBlob.getBytes())
}

function uncompressString(x) {
    var zippedBytes = Utilities.base64Decode(x)
    var zippedBlob = Utilities.newBlob(zippedBytes, 'application/x-gzip')
    var stringBlob = Utilities.ungzip(zippedBlob)
    return stringBlob.getDataAsString()
}

function getTlds() {
    var cacheName = 'TLDs'
    var cache = CacheService.getScriptCache();
    var base64Encoded = cache.get(cacheName);
    if (base64Encoded != null) {
        return uncompressString(base64Encoded).split(',')
    }
    var raw = UrlFetchApp.fetch('https://publicsuffix.org/list/public_suffix_list.dat').getContentText()
    var tlds = rawToTlds(raw)
    cache.put(cacheName, compressString(tlds.join()), 21600)
    return tlds
}

function getDomainName(url, level) {
    var tlds = getTlds()

    var domain = url
        .replace(/^http(s)?:\/\//i, "")
        .replace(/^www\./i, "")
        .replace(/\/.*$/, "")
        .replace(/\?.*/, "");

    if (typeof level === 'undefined') {
        return domain
    }

    var result = domain
    var longest = 0
    for (i in tlds) {
        var tld = '.' + tlds[i]
        if (endsWith(domain, tld) && tld.length > longest) {
            var parts = domain.substring(0, domain.length - tld.length).split('.')
            result = parts.slice(parts.length-level+1, parts.length).join('.') + tld
            longest = tld.length
        }
    }

    return result
}
Run Code Online (Sandbox Code Playgroud)

要获得 A1 的二级 domian,请像这样使用它

=getDomainName(A1, 2)
Run Code Online (Sandbox Code Playgroud)

要获得 A1 的完整域,只需执行以下操作

=getDomainName(A1)
Run Code Online (Sandbox Code Playgroud)

编辑

公共后缀列表已超过 100KB。它不再适合 Apps 脚本缓存。所以我现在正在压缩它。