文字列からホスト名を抽出


238

テキスト文字列からのURL全体ではなく、URLのルートのみを照合したいと思います。与えられた:

http://www.youtube.com/watch?v=ClkQA2Lb_iE
http://youtu.be/ClkQA2Lb_iE
http://www.example.com/12xy45
http://example.com/random

www.example.comまたはexample.comドメインに解決する最後の2つのインスタンスを取得したい。

私は正規表現が遅いと聞いたので、これはページで2番目の正規表現になるので、正規表現なしでそれを行う方法がある場合は、私に知らせてください。

このソリューションのJS / jQueryバージョンを探しています。

回答:


281

npmパッケージpsl(パブリックサフィックスリスト)の使用をお勧めします。「パブリックサフィックスリスト」は、国コードトップレベルドメインだけでなく、ルートドメインと見なされるUnicode文字(www。食狮。公司.cn、bckobeなど)のすべての有効なドメインサフィックスとルールのリストです。 .jpなど)。詳しくはこちらをご覧ください

試してください:

npm install --save psl

次に、「extractHostname」実装を実行します。

let psl = require('psl');
let url = 'http://www.youtube.com/watch?v=ClkQA2Lb_iE';
psl.get(extractHostname(url)); // returns youtube.com

npmパッケージは使用できないため、以下では、extractHostnameのみをテストします。

function extractHostname(url) {
    var hostname;
    //find & remove protocol (http, ftp, etc.) and get hostname

    if (url.indexOf("//") > -1) {
        hostname = url.split('/')[2];
    }
    else {
        hostname = url.split('/')[0];
    }

    //find & remove port number
    hostname = hostname.split(':')[0];
    //find & remove "?"
    hostname = hostname.split('?')[0];

    return hostname;
}

//test the code
console.log("== Testing extractHostname: ==");
console.log(extractHostname("http://www.blog.classroom.me.uk/index.php"));
console.log(extractHostname("http://www.youtube.com/watch?v=ClkQA2Lb_iE"));
console.log(extractHostname("https://www.youtube.com/watch?v=ClkQA2Lb_iE"));
console.log(extractHostname("www.youtube.com/watch?v=ClkQA2Lb_iE"));
console.log(extractHostname("ftps://ftp.websitename.com/dir/file.txt"));
console.log(extractHostname("websitename.com:1234/dir/file.txt"));
console.log(extractHostname("ftps://websitename.com:1234/dir/file.txt"));
console.log(extractHostname("example.com?param=value"));
console.log(extractHostname("https://facebook.github.io/jest/"));
console.log(extractHostname("//youtube.com/watch?v=ClkQA2Lb_iE"));
console.log(extractHostname("http://localhost:4200/watch?v=ClkQA2Lb_iE"));

プロトコルやポート番号さえ持っていても、ドメインを抽出できます。これは非常に単純化された非正規表現のソリューションなので、これでうまくいくと思います。

* @ Timmerz、@ renoirb、@ rineez、@ BigDong、@ ra00l、@ ILikeBeansTacos、@ CharlesRobertson、ご提案ありがとうございます。@ ross-allen、バグを報告してくれてありがとう!


3
プロトコル表記の長さもサポートすることをお勧めします。改善があるかもしれないurl.split('/')[2]にかかわらず、私たちが書くののでftpftpshttps、ドメイン名は常にインデックス2になります
renoirb

1
シナリオによってreturn url.split('/')[2] || url.split('/')[0];は、プロトコルがない場合に一致するものを使用する必要があります。
Timmerz 2014年

1
この関数が「ftp.websitename.com/dir/file.txt」のような入力に対してドメイン名を返すことができないという事実を無視しているのはなぜですか?
rineez

1
@renoirbすみません、これはダックのタイピングにどのように従うのですか?
rineez

6
1つは、youtube.com / watch-> www.youtube.comがyoutube.comドメインのwwwサブドメインです。余分なWWWを削除するには、私が追加しました:if (domain.split('.').length > 2) { //has also subdomain var splitArr = domain.split('.'); domain = splitArr[splitArr.length - 2] + '.' + splitArr[splitArr.length - 1]; }
ra00l

306

正規表現を使わないきちんとしたトリック:

var tmp        = document.createElement ('a');
;   tmp.href   = "http://www.example.com/12xy45";

// tmp.hostname will now contain 'www.example.com'
// tmp.host will now contain hostname and port 'www.example.com:80'

上記を以下のような関数でラップすると、URIからドメイン部分を奪う優れた方法が得られます。

function url_domain(data) {
  var    a      = document.createElement('a');
         a.href = data;
  return a.hostname;
}

8
実際にはparseUriソリューションを試しますが、創造性のために+1します。
Chamilyan、2011

11
@Chamilyan私はあなたがこの答えを受け入れるべきだと思います..それははるかに涼しく、余分なものなしで動作します:)
Lipis

3
ただfyi-このソリューションはポート番号を処理しません
Kyle

1
@Kyle確かにそうです。ポート番号がの一部である必要があることを示唆しているhostname場合、そうではありません。hostnameとの両方にアクセスしたい場合port(そしてそれdomain.sample:1234だけでアクセスする場合a.host
FilipRoséen-refp

46
高速に実行する必要がある場合は、これを使用しないでください。gilly3の方法よりも40〜60倍遅くなります。jsperfでテスト済み:jsperf.com/hostname-from-url
cprcrack 2013年

137

文字列を解析する必要はありません。URLコンストラクタの引数としてURLを渡すだけです。

var url = 'http://www.youtube.com/watch?v=ClkQA2Lb_iE';
var hostname = (new URL(url)).hostname;

assert(hostname === 'www.youtube.com');

6
以下の@mcによる回答と同じです。また、「新しいURL()はIEでは動作しない(IE11でテスト済み)」というコメントもご覧ください。
Chamilyan 2016

2
しかし、おそらくソリューションで作業するのが最も簡単なので、+ 1
Chamilyan

1
私はこれをChrome拡張機能で使用しているため、現時点ではIEのサポートは問題ありません。
bodine 2017年

1
+1これは受け入れられた答えであるはずです。高速で信頼性が高く、すべての最新ブラウザで動作し、外部ライブラリに依存せず、理解しやすいです(正規表現ソリューションとは対照的)。また、すべてのブラウザーが実行する機能の中核にあるため、非常に高速であると思います(ただし、通常はそれほど重要ではありません)。
johndodo

128

これを試して:

var matches = url.match(/^https?\:\/\/([^\/?#]+)(?:[\/?#]|$)/i);
var domain = matches && matches[1];  // domain will be null if no match is found

結果からポートを除外する場合は、代わりに次の式を使用します。

/^https?\:\/\/([^\/:?#]+)(?:[\/:?#]|$)/i

編集:特定のドメインが一致しないようにするには、否定先読みを使用します。(?!youtube.com)

/^https?\:\/\/(?!(?:www\.)?(?:youtube\.com|youtu\.be))([^\/:?#]+)(?:[\/:?#]|$)/i

3
protocol:// username:password @ host:port / path / to / resource ...などの形式を忘れないでください
Andrew White

1
閉じるが、URLにパスがなく、ホスト部分が?' (query) or # `(フラグメント)で終了する可能性がある。たとえばhttp://example.com?var=valまたはhttp://example.com#fragment。したがって、正しい正規表現は次のようになります/^https?\:\/\/([^\/?#]+)/。それ以外の場合は、+ 1(これが最速の解決策です)を取得します
ridgerunner

2
(?:www\.)?否定先読みにオプションを追加することもできます。
ridgerunner

3
+1非常に高速であるため、これは私の場合の要件です
cprcrack

8
@FellowStranger-次の(?:www\.)?ように正規表現に追加します:/^https?\:\/\/(?:www\.)?([^\/?#]+)(?:[\/?#]|$)/i
gilly3 '06

37

ポート番号と特殊文字を使用できるため、URLの解析は難しい場合があります。そのため、parseUriなどを使用してこれを行うことをお勧めします。何百ものURLを解析しない限り、パフォーマンスが問題になるとは思えません。


12
高速に実行する必要がある場合は、これを使用しないでください。ホスト名を取得するだけでは、gilly3の方法よりも約40〜60倍遅くなります。jsperfでテスト済み:jsperf.com/hostname-from-url
cprcrack 2013年

ここで更新されたURLは、(他の1つのリターンが見つからない404)です:javascriptoo.com/application/html/js/franzenzenhofer/parseUri/...
ub3rst4r

@BigDong多分あなたは簡単にlibを要求できますか?nodejs.org/api/...
MC。

2
残念ながら、URLはIE10ではサポートされていません。
advncd 2015

1
URL()はまだ完全にはサポートされていません。チェック:caniuse.com/#feat=url
Kousha

31

URL.hostname読みやすさのために使用

バベル時代では、最もクリーンで簡単なソリューションはを使用することURL.hostnameです。

const getHostname = (url) => {
  // use URL constructor and return hostname
  return new URL(url).hostname;
}

// tests
console.log(getHostname("/programming/8498592/extract-hostname-name-from-string/"));
console.log(getHostname("https://developer.mozilla.org/en-US/docs/Web/API/URL/hostname"));

URL.hostnameURL APIの一部であり、IE(caniuse)を除くすべての主要なブラウザでサポートされています。レガシーブラウザをサポートする必要がある場合は、URLポリフィルを使用してください。

このソリューションを使用すると、他のURLプロパティとメソッドにアクセスすることもできます。これは、たとえば、URLのパス名クエリ文字列paramsも抽出する場合に役立ちます。


パフォーマンスのためにRegExを使用する

URL.hostnameアンカーソリューションまたはparseUriを使用するよりも高速です。ただし、それでもgilly3の正規表現よりもはるかに低速です。

const getHostnameFromRegex = (url) => {
  // run against regex
  const matches = url.match(/^https?\:\/\/([^\/?#]+)(?:[\/?#]|$)/i);
  // extract hostname (will be null if no match is found)
  return matches && matches[1];
}

// tests
console.log(getHostnameFromRegex("/programming/8498592/extract-hostname-name-from-string/"));
console.log(getHostnameFromRegex("https://developer.mozilla.org/en-US/docs/Web/API/URL/hostname"));

このjsPerfで自分でテストしてください

非常に多数のURLを処理する必要がある場合(パフォーマンスが重要になる場合)、代わりにこのソリューションを使用することをお勧めします。それ以外の場合は、URL.hostname読みやすくするために選択します。


15

私はギブンズソリューションを使おうとしましたが、選択されたものは私の目的にとってはやり過ぎであり、「要素を作成する」ものは私を台無しにしてしまいました。

URLのポートの準備がまだ整っていません。私は誰かがそれが便利だと思うことを望みます

function parseURL(url){
    parsed_url = {}

    if ( url == null || url.length == 0 )
        return parsed_url;

    protocol_i = url.indexOf('://');
    parsed_url.protocol = url.substr(0,protocol_i);

    remaining_url = url.substr(protocol_i + 3, url.length);
    domain_i = remaining_url.indexOf('/');
    domain_i = domain_i == -1 ? remaining_url.length - 1 : domain_i;
    parsed_url.domain = remaining_url.substr(0, domain_i);
    parsed_url.path = domain_i == -1 || domain_i + 1 == remaining_url.length ? null : remaining_url.substr(domain_i + 1, remaining_url.length);

    domain_parts = parsed_url.domain.split('.');
    switch ( domain_parts.length ){
        case 2:
          parsed_url.subdomain = null;
          parsed_url.host = domain_parts[0];
          parsed_url.tld = domain_parts[1];
          break;
        case 3:
          parsed_url.subdomain = domain_parts[0];
          parsed_url.host = domain_parts[1];
          parsed_url.tld = domain_parts[2];
          break;
        case 4:
          parsed_url.subdomain = domain_parts[0];
          parsed_url.host = domain_parts[1];
          parsed_url.tld = domain_parts[2] + '.' + domain_parts[3];
          break;
    }

    parsed_url.parent_domain = parsed_url.host + '.' + parsed_url.tld;

    return parsed_url;
}

これを実行する:

parseURL('https://www.facebook.com/100003379429021_356001651189146');

結果:

Object {
    domain : "www.facebook.com",
    host : "facebook",
    path : "100003379429021_356001651189146",
    protocol : "https",
    subdomain : "www",
    tld : "com"
}

1
私は通常、投票数の少ない回答を見逃しますが、この回答には注意が必要でした。よく働く!ありがとう@BlackDivine
Devaroop、

私の努力に感謝する時間を割いていただきありがとうございます@Devaroop
BlackDivine

15

このページが表示され、URLの最適な正規表現を探している場合は、次のようにしてください。

^(?:https?:)?(?:\/\/)?([^\/\?]+)

https://regex101.com/r/pX5dL9/1

http://なし、http付き、https付き、//付きのURLで機能し、パスとクエリパスも取得しません。

幸運を


このリンクで質問に答えることができますが、回答の重要な部分をここに含め、参照用のリンクを提供することをお勧めします。リンクされたページが変更されると、リンクのみの回答が無効になる可能性があります。- レビューから
ローレンスアイエロ

1
正規表現を編集して送信しました:)
Luis Lopes

6

すべてのURLプロパティ、依存関係なし、JQueryなし、理解しやすい

このソリューションはあなたの答えと追加のプロパティを提供します。JQueryやその他の依存関係は必要ありません。貼り付けて実行します。

使用法

getUrlParts("https://news.google.com/news/headlines/technology.html?ned=us&hl=en")

出力

{
  "origin": "https://news.google.com",
  "domain": "news.google.com",
  "subdomain": "news",
  "domainroot": "google.com",
  "domainpath": "news.google.com/news/headlines",
  "tld": ".com",
  "path": "news/headlines/technology.html",
  "query": "ned=us&hl=en",
  "protocol": "https",
  "port": 443,
  "parts": [
    "news",
    "google",
    "com"
  ],
  "segments": [
    "news",
    "headlines",
    "technology.html"
  ],
  "params": [
    {
      "key": "ned",
      "val": "us"
    },
    {
      "key": "hl",
      "val": "en"
    }
  ]
}

コード
コードは、超高速というよりは理解しやすいように設計されています。1秒あたり100回簡単に呼び出すことができるため、フロントエンドやいくつかのサーバーの使用には最適ですが、大量のスループットには適していません。

function getUrlParts(fullyQualifiedUrl) {
    var url = {},
        tempProtocol
    var a = document.createElement('a')
    // if doesn't start with something like https:// it's not a url, but try to work around that
    if (fullyQualifiedUrl.indexOf('://') == -1) {
        tempProtocol = 'https://'
        a.href = tempProtocol + fullyQualifiedUrl
    } else
        a.href = fullyQualifiedUrl
    var parts = a.hostname.split('.')
    url.origin = tempProtocol ? "" : a.origin
    url.domain = a.hostname
    url.subdomain = parts[0]
    url.domainroot = ''
    url.domainpath = ''
    url.tld = '.' + parts[parts.length - 1]
    url.path = a.pathname.substring(1)
    url.query = a.search.substr(1)
    url.protocol = tempProtocol ? "" : a.protocol.substr(0, a.protocol.length - 1)
    url.port = tempProtocol ? "" : a.port ? a.port : a.protocol === 'http:' ? 80 : a.protocol === 'https:' ? 443 : a.port
    url.parts = parts
    url.segments = a.pathname === '/' ? [] : a.pathname.split('/').slice(1)
    url.params = url.query === '' ? [] : url.query.split('&')
    for (var j = 0; j < url.params.length; j++) {
        var param = url.params[j];
        var keyval = param.split('=')
        url.params[j] = {
            'key': keyval[0],
            'val': keyval[1]
        }
    }
    // domainroot
    if (parts.length > 2) {
        url.domainroot = parts[parts.length - 2] + '.' + parts[parts.length - 1];
        // check for country code top level domain
        if (parts[parts.length - 1].length == 2 && parts[parts.length - 1].length == 2)
            url.domainroot = parts[parts.length - 3] + '.' + url.domainroot;
    }
    // domainpath (domain+path without filenames) 
    if (url.segments.length > 0) {
        var lastSegment = url.segments[url.segments.length - 1]
        var endsWithFile = lastSegment.indexOf('.') != -1
        if (endsWithFile) {
            var fileSegment = url.path.indexOf(lastSegment)
            var pathNoFile = url.path.substr(0, fileSegment - 1)
            url.domainpath = url.domain
            if (pathNoFile)
                url.domainpath = url.domainpath + '/' + pathNoFile
        } else
            url.domainpath = url.domain + '/' + url.path
    } else
        url.domainpath = url.domain
    return url
}

かなり単純な解析で失敗します。getUrlParts('www.google.com')このページのコンソールで試してください。
Chamilyan 2017年

@ChamilyanこれはURLではありません。URLにはプロトコルがあります。ただし、より一般的なケースを処理するようにコードを更新したので、反対票を取り戻してください。
ホイットニーランド2017年

私はあなたに反対票を投じませんでした。しかし、元の質問で特にhttp://を要求していなかったとしたら、そうでしょう。
Chamilyan 2017年

2
@Leeは、この入力に失敗した:なければならないが、それは出力:ながら、サブドメインである(ドメインが複数のサブドメインを有することができます)。var url="https://mail.gggg.google.cn/link/link/link";domainrootgoogle.comgggg.google.cngggg
なし


4

今日、この問題の解決策を探していました。上記の答えはどれも満足できるようには見えなかった。私は、1つのライナーで、条件付きロジックがなく、関数にラップする必要のないソリューションを望んでいました。

これが私が思いついたもので、本当にうまくいくようです:

hostname = "http://www.example.com:1234"
hostname.split( "//")。slice(-1)[0] .split( ":")[0] .split( '。')。slice(-2).join( '。')// 「example.com」を与える

一見複雑に見えるかもしれませんが、それはかなり単純に機能します。重要なのは、スプリット配列の最後から(そして[0]でスプリット配列の前から取得するために)良い部分をプルする必要があるいくつかの場所で 'slice(-n)'を使用することです。

これらの各テストは「example.com」を返します。

"http://example.com" .split( "//").slice(-1)[0] .split( ":")[0] .split( '。')。slice(-2)。参加する( '。')
"http://example.com:1234".split("//").slice(-1)[0].split(":")[0].split('.').slice(-2 ).join( '。')
"http://www.example.com:1234" .split( "//").slice(-1)[0] .split( ":")[0] .split( '。')。slice( -2).join( '。')
"http://foo.www.example.com:1234" .split( "//").slice(-1)[0] .split( ":")[0] .split( '。') slice(-2).join( '。')

wwwが無関係であるケースを処理するのでいい
Chamilyan

4

ここにjQueryのワンライナーがあります:

$('<a>').attr('href', url).prop('hostname');

3
String.prototype.trim = function(){return his.replace(/^\s+|\s+$/g,"");}
function getHost(url){
    if("undefined"==typeof(url)||null==url) return "";
    url = url.trim(); if(""==url) return "";
    var _host,_arr;
    if(-1<url.indexOf("://")){
        _arr = url.split('://');
        if(-1<_arr[0].indexOf("/")||-1<_arr[0].indexOf(".")||-1<_arr[0].indexOf("\?")||-1<_arr[0].indexOf("\&")){
            _arr[0] = _arr[0].trim();
            if(0==_arr[0].indexOf("//")) _host = _arr[0].split("//")[1].split("/")[0].trim().split("\?")[0].split("\&")[0];
            else return "";
        }
        else{
            _arr[1] = _arr[1].trim();
            _host = _arr[1].split("/")[0].trim().split("\?")[0].split("\&")[0];
        }
    }
    else{
        if(0==url.indexOf("//")) _host = url.split("//")[1].split("/")[0].trim().split("\?")[0].split("\&")[0];
        else return "";
    }
    return _host;
}
function getHostname(url){
    if("undefined"==typeof(url)||null==url) return "";
    url = url.trim(); if(""==url) return "";
    return getHost(url).split(':')[0];
}
function getDomain(url){
    if("undefined"==typeof(url)||null==url) return "";
    url = url.trim(); if(""==url) return "";
    return getHostname(url).replace(/([a-zA-Z0-9]+.)/,"");
}

そのため、ここにコメントを追加します。このコードは、//で始まるURL、またはqqq.qqq.qqq&test = 2のような構文エラーがあるか、?param = www.www
QazyCat

3
function hostname(url) {
    var match = url.match(/:\/\/(www[0-9]?\.)?(.[^/:]+)/i);
    if ( match != null && match.length > 2 && typeof match[2] === 'string' && match[2].length > 0 ) return match[2];
}

上記のコードは、次のURLの例のホスト名を正常に解析します。

http://WWW.first.com/folder/page.html first.com

http://mail.google.com/folder/page.html mail.google.com

https://mail.google.com/folder/page.html mail.google.com

http://www2.somewhere.com/folder/page.html?q=1 somewhere.com

https://www.another.eu/folder/page.html?q=1 another.eu

元のクレジットはhttp://www.primaryobjects.com/CMS/Article145に送られます


3

わかりました、これは古い質問ですが、非常に効率的なURLパーサーを作成したので、共有したいと思いました。

ご覧のとおり、関数の構造は非常に奇妙ですが、それは効率のためです。プロトタイプ関数は使用されず、文字列は2回以上繰り返されず、文字は必要以上に処理されません。

function getDomain(url) {
    var dom = "", v, step = 0;
    for(var i=0,l=url.length; i<l; i++) {
        v = url[i]; if(step == 0) {
            //First, skip 0 to 5 characters ending in ':' (ex: 'https://')
            if(i > 5) { i=-1; step=1; } else if(v == ':') { i+=2; step=1; }
        } else if(step == 1) {
            //Skip 0 or 4 characters 'www.'
            //(Note: Doesn't work with www.com, but that domain isn't claimed anyway.)
            if(v == 'w' && url[i+1] == 'w' && url[i+2] == 'w' && url[i+3] == '.') i+=4;
            dom+=url[i]; step=2;
        } else if(step == 2) {
            //Stop at subpages, queries, and hashes.
            if(v == '/' || v == '?' || v == '#') break; dom += v;
        }
    }
    return dom;
}

3

これは完全な答えではありませんが、以下のコードはあなたを助けるでしょう:

function myFunction() {
    var str = "https://www.123rf.com/photo_10965738_lots-oop.html";
    matches = str.split('/');
    return matches[2];
}

私よりも速くコードを作成してほしい。それは私自身を改善するのにも役立ちます。


3

jqueryのあるoneline

$('<a>').attr('href', document.location.href).prop('hostname');

2
// use this if you know you have a subdomain
// www.domain.com -> domain.com
function getDomain() {
  return window.location.hostname.replace(/([a-zA-Z0-9]+.)/,"");
}

2

私は個人的にこのソリューションについて多くのことを調査しましたが、私が見つけることができる最高のものは実際にはCloudFlareの「ブラウザチェック」からのものです。

function getHostname(){  
            secretDiv = document.createElement('div');
            secretDiv.innerHTML = "<a href='/'>x</a>";
            secretDiv = secretDiv.firstChild.href;
            var HasHTTPS = secretDiv.match(/https?:\/\//)[0];
            secretDiv = secretDiv.substr(HasHTTPS.length);
            secretDiv = secretDiv.substr(0, secretDiv.length - 1);
            return(secretDiv);  
}  

getHostname();

私は変数をより人間が読みやすいように書き直しましたが、予想よりもうまく機能します。


2

まあ、正規表現を使用する方がはるかに簡単です。

    mainUrl = "http://www.mywebsite.com/mypath/to/folder";
    urlParts = /^(?:\w+\:\/\/)?([^\/]+)(.*)$/.exec(mainUrl);
    host = Fragment[1]; // www.mywebsite.com

2
import URL from 'url';

const pathname = URL.parse(url).path;
console.log(url.replace(pathname, ''));

これは両方のプロトコルを処理します。


実際、このモジュールはNodeJSで提供されています。
ジジ

1

簡単に言えば、あなたはこのようにすることができます

var url = "http://www.someurl.com/support/feature"

function getDomain(url){
  domain=url.split("//")[1];
  return domain.split("/")[0];
}
eg:
  getDomain("http://www.example.com/page/1")

  output:
   "www.example.com"

上記の関数を使用してドメイン名を取得します


何が問題なの?
uzaif

問題は、前にスラッシュがないと機能しないことですか?
ツールキット

あなたの場合、あなた?はあなたのドメイン名の文字列をチェックする必要があり、return domain.split("/")[0]; このreturn domain.split("?")[0];希望を置く代わりにそれはうまくいく
uzaif


0

コード:

var regex = /\w+.(com|co\.kr|be)/ig;
var urls = ['http://www.youtube.com/watch?v=ClkQA2Lb_iE',
            'http://youtu.be/ClkQA2Lb_iE',
            'http://www.example.com/12xy45',
            'http://example.com/random'];


$.each(urls, function(index, url) {
    var convertedUrl = url.match(regex);
    console.log(convertedUrl);
});

結果:

youtube.com
youtu.be
example.com
example.com

@ChristianTernus反対に; OPは正規表現に言及しており、これは明らかにURLの要求された部分に一致するように設計された正規表現です。完全に正しいわけではwww.ありませんが(たとえば、すべてのURLにこのコンポーネントがあるわけではありませんが必要です)、確かに答えです。
カイルストランド

@KyleStrand Prettyは明らかに主観的な判断です。「このソリューションのJS / jQueryバージョンを探しています」という質問に対して生の正規表現を提供しても、その答えにはなりません。
Christian Ternus

私はOPです。私は、JSですぐに使えるソリューションを探していた当時、新しい開発者でした。実際、コンテキストのない生の正規表現文字列はまったく役に立ちませんでした。さらに、それは不完全です。
Chamilyan 2016

0

parse-domain-非常に堅固な軽量ライブラリ

npm install parse-domain

const { fromUrl, parseDomain } = require("parse-domain");

例1

parseDomain(fromUrl("http://www.example.com/12xy45"))
{ type: 'LISTED',
  hostname: 'www.example.com',
  labels: [ 'www', 'example', 'com' ],
  icann:
   { subDomains: [ 'www' ],
     domain: 'example',
     topLevelDomains: [ 'com' ] },
  subDomains: [ 'www' ],
  domain: 'example',
  topLevelDomains: [ 'com' ] }

例2

parseDomain(fromUrl("http://subsub.sub.test.ExAmPlE.coM/12xy45"))
{ type: 'LISTED',
  hostname: 'subsub.sub.test.example.com',
  labels: [ 'subsub', 'sub', 'test', 'example', 'com' ],
  icann:
   { subDomains: [ 'subsub', 'sub', 'test' ],
     domain: 'example',
     topLevelDomains: [ 'com' ] },
  subDomains: [ 'subsub', 'sub', 'test' ],
  domain: 'example',
  topLevelDomains: [ 'com' ] }

どうして?

ユースケースとボリュームに応じて、正規表現または他の文字列操作手段を使用してこの問題を自分で解決しないことを強くお勧めします。この問題の核心は、URL文字列をドメインとサブドメインに正しく解析するためにすべてのgtldおよびcctldサフィックスを知る必要があることです。これらのサフィックスは定期的に更新されます。これは解決された問題であり、自分で解決したい問題ではありません(グーグルか何かでない限り)。ピンチでホスト名またはドメイン名が必要な場合を除いて、これから抜け出す方法を解析しないでください。


そのおそらく環境/バージョン管理の問題は、このnpmjs.com/package/parse-domainを
グレントンプソン

-1

私のコードは次のようになります。正規表現にはさまざまな形式がありますが、ここでは、よりスケーラブルなテストケースを紹介します。

function extractUrlInfo(url){
  let reg = /^((?<protocol>http[s]?):\/\/)?(?<host>((\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])|[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)))(\:(?<port>[0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5]))?$/
  return reg.exec(url).groups
}

var url = "https://192.168.1.1:1234"
console.log(extractUrlInfo(url))
var url = "/programming/8498592/extract-hostname-name-from-string"
console.log(extractUrlInfo(url))


-6

正規表現を使用して正確なドメイン名を取得するには、以下のコードを試してください。

String line = " http://www.youtube.com/watch?v=ClkQA2Lb_iE ";

  String pattern3="([\\w\\W]\\.)+(.*)?(\\.[\\w]+)";

  Pattern r = Pattern.compile(pattern3);


  Matcher m = r.matcher(line);
  if (m.find( )) {

    System.out.println("Found value: " + m.group(2) );
  } else {
     System.out.println("NO MATCH");
  }

2
OPはJavaではなくJavaScriptで答えを探していました。
piersadrian 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.