web-dev-qa-db-ja.com

GoogleスプレッドシートのURL文字列からルートドメインを抽出する

こんにちは私はGoogleスプレッドシートのURL文字列からルートドメインを抽出しようとしています。ドメインを取得する方法を知っていて、www.を削除する式がありますが、 'mysite'.site.comのようなサブドメインプレフィックスが削除されないことがわかりました。ここで、mysiteはドメイン名から削除されません。

質問:ドメイン文字列が英数字と接触するdomain.comrootdomainを取得するにはどうすればよいですか? 、次に1ドット、次に英数字(およびそれ以上)

これまでのGoogleスプレッドシートの数式:

=REGEXREPLACE(REGEXREPLACE(D3923;"(http(s)?://)?(www\.)?";"");"/.*";"")

多分これは単純化することができます...

テストケース

    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

enter image description here

12
snh_nl

現在使用中:

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

正常に動作しているようです

更新日:2016年7月7日

(すべての助けに感謝します!)

17
snh_nl

Co.uk、gov.ukなどのTLDがあるため、最も信頼できる方法は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 getTlds() {
    var cacheName = 'TLDs'
    var cache = CacheService.getScriptCache();
    var list = cache.get(cacheName);
    if (list != null) {
        return list.split(',')
    }

    var raw = UrlFetchApp.fetch('https://publicsuffix.org/list/public_suffix_list.dat').getContentText()
    var tlds = rawToTlds(raw)
    cache.put(cacheName, tlds.join(), 60000)
    return tlds
}

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

    var domain = url
        .replace(/^http(s)?:\/\//i, "")
        .replace(/^www\./i, "")
        .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
}

A1の第2レベルのドミアンを取得するには、次のように使用します

=getDomainName(A1, 2)

A1の完全なドメインを取得するには、

=getDomainName(A1)
2
Igor Mikushkin