web-dev-qa-db-ja.com

正規表現を使用してURLからトップレベルドメインとセカンドレベルドメインを抽出する

どうすれば正規表現を使用してURLからトップレベルドメインとセカンドレベルドメインのみを抽出できますか?下位レベルのドメインをすべてスキップしたい。何か案は?

14
mel

これが私の考えです

_$_アンカーを使用して、行の終わりから3回、ドット以外のものに一致させます。

文字列の最後からの最後の一致は、_.com.au_または_.co.nz_タイプのドメインを許可するためにオプションにする必要があります。

最後と2番目の一致はどちらも2〜3文字しか一致しないため、セカンドレベルのドメイン名と混同されることはありません。


正規表現:

[^.]*\.[^.]{2,3}(?:\.[^.]{2,3})?$


デモンストレーション:

Regex101の例

22
Vasili Syrakis

2019年更新

これは古い質問であり、ここでの課題は、新しいバニティTLDとccTLDの第2レベルドメイン(例:.co.uk.org.uk)。そのため、正規表現はほぼ間違いなく偽陽性または陰性を返すことが保証されています。

プライマリホストを確実に取得する唯一の方法は、 パブリックサフィックスリスト のように、それらを認識しているサービスを呼び出すことです。

psl のように使用できるオープンソースライブラリがいくつかありますが、独自に作成することもできます。

pslの使い方は非常に直感的です。彼らのドキュメントから:

var psl = require('psl');

// Parse domain without subdomain
var parsed = psl.parse('google.com');
console.log(parsed.tld); // 'com'
console.log(parsed.sld); // 'google'
console.log(parsed.domain); // 'google.com'
console.log(parsed.subdomain); // null

// Parse domain with subdomain
var parsed = psl.parse('www.google.com');
console.log(parsed.tld); // 'com'
console.log(parsed.sld); // 'google'
console.log(parsed.domain); // 'google.com'
console.log(parsed.subdomain); // 'www'

// Parse domain with nested subdomains
var parsed = psl.parse('a.b.c.d.foo.com');
console.log(parsed.tld); // 'com'
console.log(parsed.sld); // 'foo'
console.log(parsed.domain); // 'foo.com'
console.log(parsed.subdomain); // 'a.b.c.d'

古い答え

あなたはこれを使うことができます:

(\w+\.\w+)$

詳細(サンプルファイル、使用している言語)がないと、これが機能するかどうかを正確に判別することは困難です。

例: http://regex101.com/r/wD8eP2

8
brandonscript

JavaScriptを使用していて、トップレベルドメインとセカンドレベルドメインを抽出する簡単な方法が必要な人のために、私は次のようにしています。

'example.aus.com'.match(/\.\w{2,3}\b/g).join('')

これは、ピリオドの後に2文字または3文字が続き、次に Word境界 と一致します。

次に出力例をいくつか示します。

'example.aus.com'       // .aus.com
'example.austin.com'    // .com
'example.aus.com/howdy' // .aus.com
'example.co.uk/howdy'   // .co.uk

一部の人々は少し賢い何かを必要とするかもしれませんが、これは私の特定のデータセットで私にとっては十分でした。

編集

3文字より長い(そして許可されている)セカンドレベルドメインが実際にかなりあることに気づきました。したがって、ここでも簡単にするために、正規表現の文字カウント要素を削除しました。

'example.aus.com'.match(/\.\w*\b/g).join('')
1
shennan

また、おそらく次のような表現でそれを行うことができます。

^(?:https?:\/\/)(?:w{3}\.)?.*?([^.\r\n\/]+\.)([^.\r\n\/]+\.[^.\r\n\/]{2,6}(?:\.[^.\r\n\/]{2,6})?).*$

uRLのコンポーネントをキャプチャするキャプチャグループと同じだけ追加します。

デモ


式を簡略化/変更/探索したい場合は、 regex101.com の右上のパネルで説明されています。必要に応じて、いくつかのサンプル入力とどのように一致するかを this link で確認することもできます。


RegEx回路

jex.im 正規表現を視覚化します。

enter image description here

0
Emma

特定のトップレベルドメイン名がすべて必要な場合は、次のような正規表現を記述できます。

[RegularExpression("^(https?:\\/\\/)?(([\\w]+)?\\.?(\\w+\\.((za|zappos|zara|zero|Zip|zippo|zm|zone|zuerich|zw))))\\/?$", ErrorMessage = "Is not a valid fully-qualified URL.")]

このリンクからドメイン名を追加することもできます:

https://www.icann.org/resources/pages/tlds-2012-02-25-en

0
Sam

捕獲グループを使用すると、いくつかの魔法を達成することができます。

たとえば、次のJavaScriptについて考えてみます。

let hostname = 'test.something.else.be';
let domain = hostname.replace(/^.+\.([^\.]+\.[^\.]+)$/, '$1');

document.write(domain);

これにより、'else.com'を含む文字列が生成されます。これは、正規表現自体が完全な文字列と一致し、キャプチャグループが$1にマッピングされるためです。したがって、完全な文字列'test.something.else.com'を、実際には'$1'である'else.com'に置き換えます。

正規表現はきれいではなく、サブドメインを検索する深さのレベルを定義するために{3}のようなものでおそらくより動的にすることができますが、これは単なる例示です。

0
robbe clerckx