JavaScriptで文字列からベースURLを抽出する方法は?


168

JavaScript(またはjQuery)を使用して文字列変数からベースURLを抽出する比較的簡単で信頼できる方法を見つけようとしています。

たとえば、次のようなものが与えられたとします。

http://www.sitename.com/article/2009/09/14/this-is-an-article/

入手したい:

http://www.sitename.com/

正規表現が最善の策ですか?その場合、特定の文字列から抽出されたベースURLを新しい変数に割り当てるためにどのステートメントを使用できますか?

私はこれについていくつか検索を行いましたが、JavaScriptの世界で見つけたものはすべて、location.hostなどを使用して実際のドキュメントのURLからこの情報を収集することに関係しているようです。


回答:


205

編集:プロトコルを考慮していないと不満を言う人もいます。答えとしてマークされているので、コードをアップグレードすることにしました。1行のコードが好きな人のために...申し訳ありませんが、コードミニマイザーを使用するのはこのためです。コードは人間が読める形式である必要があり、この方法の方が適しています...私の意見では。

var pathArray = "https://somedomain.com".split( '/' );
var protocol = pathArray[0];
var host = pathArray[2];
var url = protocol + '//' + host;

または、下からDavidsソリューションを使用します。


6
返信ありがとうございます。ここでも、実際のドキュメントのURLではなく、文字列からベースURLを抽出しようとしています。これは私には役に立たないと思いますが、私が間違っている場合は修正してください。
Bungle

2
pathArray = String( " YourHost.com/url/nic/or/not "). split( '/'); host = pathArray [2];

4
了解しました。Rafalとdaddywoodlandに感謝します。私は次のように使用することになりました:url = ' sitename.com/article/2009/09/14/this-is-an-article '; pathArray =(url).split( '/'); ホスト= 'http://' + pathArray [2]; ラファルの例では、処理しているすべての文字列に存在する「http://」を省略しただけだと思います。この場合、pathArray [2]が必要です。「http://」接頭辞がない場合、pathArray [0]が1になります。再度、感謝します。
Bungle

4
なぜすべての変数宣言ですか?url = 'sitename.com/article/2009/09/14/this-is-an-article'; newurl = 'http://' + url.split('/')[0];
ErikE 2010

1
pathArray = window.location.href.split( '/'); protocol = pathArray [0]; host = pathArray [2]; url = protocol + '://' + host; //now url === "http:://stackoverflow.com" チェックアウト::

154

WebKitベースのブラウザ、バージョン21以降のFirefox、およびInternet Explorerの現在のバージョン(IE 10および11)はを実装していlocation.originます。

location.origin含まれるプロトコルドメイン、および必要に応じてポート URLのを。

たとえばlocation.origin、URL http://www.sitename.com/article/2009/09/14/this-is-an-article/http://www.sitename.comです。

location.origin次の簡潔なポリフィルの使用をサポートしていないブラウザをターゲットにするには:

if (typeof location.origin === 'undefined')
    location.origin = location.protocol + '//' + location.host;

36
window.location.hostname指定した場合、ポート番号を見逃すので、を使用してくださいwindow.location.host。完全な「ベース名」になる最後のスラッシュを含むので:window.location.protocol+"//"+window.location.host + "/";
sroebuck

4
実際、window.location.hostnameは、私の場合のように別のポート番号を指定する必要がある場合にも役立ちます。
Darrell Brogdon、2012年

44

jQueryを使用する必要はありません。使用するだけです。

location.hostname

5
ありがとう-文字列では使用できませんが、できますか?私の理解では、これはドキュメントのURLでのみ機能します。
Bungle

2
これにはプロトコルとポートは含まれません。
David

32

リンクである文字列からパス、ホスト名などを取得するために分割する理由はありません。リンクを使用するだけです

//create a new element link with your link
var a = document.createElement("a");
a.href="http://www.sitename.com/article/2009/09/14/this-is-an-article/";

//hide it from view when it is added
a.style.display="none";

//add it
document.body.appendChild(a);

//read the links "features"
alert(a.protocol);
alert(a.hostname)
alert(a.pathname)
alert(a.port);
alert(a.hash);

//remove it
document.body.removeChild(a);

jQueryで要素を追加してその属性を読み取ることで、簡単に行うことができます。


6
数バイトでjQueryなしでそれを行う方法を示したのに、なぜ50KのjQueryを追加するのですか?
ティムダウン

13
ポスターがjQueryを使用していると言っているからです。
epascarello

1
ああはい、十分に公正です。それがこれほど単純な場合でも、jQueryを使用することで追加される抽象化の余分なレイヤーを使用する価値はありません。
Tim Down

2
その場合、サイト全体がjqUERYで実行されることを想定しています。kqueryは実際に物事を簡素化します。
trusktr

2
Ewww ...これはこれを行うための最良の方法ではありません... window.location.hrefから抽出する場合は、window.locationを使用します。それ以外の場合は、正規表現を使用します。
BMiner

21
var host = location.protocol + '//' + location.host + '/';

2
これは正解と見なされるべきです
Katai

16
String.prototype.url = function() {
  const a = $('<a />').attr('href', this)[0];
  // or if you are not using jQuery 👇🏻
  // const a = document.createElement('a'); a.setAttribute('href', this);
  let origin = a.protocol + '//' + a.hostname;
  if (a.port.length > 0) {
    origin = `${origin}:${a.port}`;
  }
  const {host, hostname, pathname, port, protocol, search, hash} = a;
  return {origin, host, hostname, pathname, port, protocol, search, hash};

}

次に:

'http://mysite:5050/pke45#23'.url()
 //OUTPUT : {host: "mysite:5050", hostname: "mysite", pathname: "/pke45", port: "5050", protocol: "http:",hash:"#23",origin:"http://mysite:5050"}

あなたの要求のために、あなたは必要です:

 'http://mysite:5050/pke45#23'.url().origin

レビュー07-2017:よりエレガントになり、機能が増えます

const parseUrl = (string, prop) =>  {
  const a = document.createElement('a'); 
  a.setAttribute('href', string);
  const {host, hostname, pathname, port, protocol, search, hash} = a;
  const origin = `${protocol}//${hostname}${port.length ? `:${port}`:''}`;
  return prop ? eval(prop) : {origin, host, hostname, pathname, port, protocol, search, hash}
}

その後

parseUrl('http://mysite:5050/pke45#23')
// {origin: "http://mysite:5050", host: "mysite:5050", hostname: "mysite", pathname: "/pke45", port: "5050"…}


parseUrl('http://mysite:5050/pke45#23', 'origin')
// "http://mysite:5050"

涼しい!


12

jQueryを使用している場合、これはDOMに要素を追加せずにJavaScriptで要素を操作するためのちょっとした方法です。

var myAnchor = $("<a />");

//set href    
myAnchor.attr('href', 'http://example.com/path/to/myfile')

//your link's features
var hostname = myAnchor.attr('hostname'); // http://example.com
var pathname = myAnchor.attr('pathname'); // /path/to/my/file
//...etc

1
そうだと思うmyAnchor.prop('hostname')。過去5年間でjQueryが変わったと思います...回答ありがとうございます!
Dehli

11

URLの文字列表現から基本的な値を取得するための軽い方法ですが完全なアプローチは、Douglas Crockfordの正規表現ルールです。

var yourUrl = "http://www.sitename.com/article/2009/09/14/this-is-an-article/";
var parse_url = /^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/;
var parts = parse_url.exec( yourUrl );
var result = parts[1]+':'+parts[2]+parts[3]+'/' ;

より強力なURL操作ツールキットを探している場合は、URI.jsを試してくださいこれは、ゲッター、セッター、URLの正規化などをすべて、チェーン可能なAPIでサポートしています。

jQueryプラグインを探している場合は、jquery.url.jsが役立ちます

@epascarelloが示唆しているように、それを行うためのより簡単な方法は、アンカー要素を使用することです。これには、DOM要素を作成する必要があるという欠点があります。ただし、これはクロージャーにキャッシュして、複数のURLで再利用できます。

var parseUrl = (function () {
  var a = document.createElement('a');
  return function (url) {
    a.href = url;
    return {
      host: a.host,
      hostname: a.hostname,
      pathname: a.pathname,
      port: a.port,
      protocol: a.protocol,
      search: a.search,
      hash: a.hash
    };
  }
})();

次のように使用します。

paserUrl('http://google.com');


8

window.location.href(アドレスバー)から情報を抽出する場合は、次のコードを使用して取得しますhttp://www.sitename.com/

var loc = location;
var url = loc.protocol + "//" + loc.host + "/";

文字列がある場合str、それは(window.location.hrefではなく)任意のURLであり、正規表現を使用します。

var url = str.match(/^(([a-z]+:)?(\/\/)?[^\/]+\/).*$/)[1];

私は、宇宙のみんなと同じように、正規表現を読むのが嫌いなので、英語で分解します。

  • コロンが後に続くゼロ個以上のアルファベット文字(プロトコルは省略可能)を検索します
  • //が後に続きます(省略可能)
  • /(ホスト名とポート)以外の任意の文字が続く
  • に続く /
  • 何でも続く(パス、最初の/を除く)。

DOM要素を作成したり、気が狂ったりする必要はありません。


7

私はURLからホストを抽出する単純な正規表現を使用します。

function get_host(url){
    return url.replace(/^((\w+:)?\/\/[^\/]+\/?).*$/,'$1');
}

このように使用します

var url = 'http://www.sitename.com/article/2009/09/14/this-is-an-article/'
var host = get_host(url);

場合は、urlで終わらないで終わっています。/host/

ここにいくつかのテストがあります:

describe('get_host', function(){
    it('should return the host', function(){
        var url = 'http://www.sitename.com/article/2009/09/14/this-is-an-article/';
        assert.equal(get_host(url),'http://www.sitename.com/');
    });
    it('should not have a / if the url has no /', function(){
        var url = 'http://www.sitename.com';
        assert.equal(get_host(url),'http://www.sitename.com');
    });
    it('should deal with https', function(){
        var url = 'https://www.sitename.com/article/2009/09/14/this-is-an-article/';
        assert.equal(get_host(url),'https://www.sitename.com/');
    });
    it('should deal with no protocol urls', function(){
        var url = '//www.sitename.com/article/2009/09/14/this-is-an-article/';
        assert.equal(get_host(url),'//www.sitename.com/');
    });
    it('should deal with ports', function(){
        var url = 'http://www.sitename.com:8080/article/2009/09/14/this-is-an-article/';
        assert.equal(get_host(url),'http://www.sitename.com:8080/');
    });
    it('should deal with localhost', function(){
        var url = 'http://localhost/article/2009/09/14/this-is-an-article/';
        assert.equal(get_host(url),'http://localhost/');
    });
    it('should deal with numeric ip', function(){
        var url = 'http://192.168.18.1/article/2009/09/14/this-is-an-article/';
        assert.equal(get_host(url),'http://192.168.18.1/');
    });
});

6

以下のコードを使用して、現在のURLのさまざまなパラメーターを取得できます

alert("document.URL : "+document.URL);
alert("document.location.href : "+document.location.href);
alert("document.location.origin : "+document.location.origin);
alert("document.location.hostname : "+document.location.hostname);
alert("document.location.host : "+document.location.host);
alert("document.location.pathname : "+document.location.pathname);

4
function getBaseURL() {
    var url = location.href;  // entire url including querystring - also: window.location.href;
    var baseURL = url.substring(0, url.indexOf('/', 14));


    if (baseURL.indexOf('http://localhost') != -1) {
        // Base Url for localhost
        var url = location.href;  // window.location.href;
        var pathname = location.pathname;  // window.location.pathname;
        var index1 = url.indexOf(pathname);
        var index2 = url.indexOf("/", index1 + 1);
        var baseLocalUrl = url.substr(0, index2);

        return baseLocalUrl + "/";
    }
    else {
        // Root Url for domain name
        return baseURL + "/";
    }

}

その後、次のように使用できます...

var str = 'http://en.wikipedia.org/wiki/Knopf?q=1&t=2';
var url = str.toUrl();

urlの値は...

{
"original":"http://en.wikipedia.org/wiki/Knopf?q=1&t=2",<br/>"protocol":"http:",
"domain":"wikipedia.org",<br/>"host":"en.wikipedia.org",<br/>"relativePath":"wiki"
}

「var url」にも2つのメソッドが含まれています。

var paramQ = url.getParameter('q');

この場合、paramQの値は1になります。

var allParameters = url.getParameters();

allParametersの値は、パラメーター名のみになります。

["q","t"]

IE、chrome、firefoxでテスト済み。


1
何か不足していると思います... toUrlはどこから来ますか?
thomasf1 2016年

3

window.location.protocolとwindow.location.originを考慮する必要がなく、指定されたポート番号が欠落しているなどの可能性がある代わりに、3番目の「/」まですべてを取得します。

// get nth occurrence of a character c in the calling string
String.prototype.nthIndex = function (n, c) {
    var index = -1;
    while (n-- > 0) {
        index++;
        if (this.substring(index) == "") return -1; // don't run off the end
        index += this.substring(index).indexOf(c);
    }
    return index;
}

// get the base URL of the current page by taking everything up to the third "/" in the URL
function getBaseURL() {
    return document.URL.substring(0, document.URL.nthIndex(3,"/") + 1);
}


1

あなたは正規表現を使用してそれを行うことができます:

/(http:\/\/)?(www)[^\/]+\//i

似合う ?


1
うーん、正規表現の制限されたスキルから、それは少なくとも近いようです。質問にさらに情報を追加して、最良の正規表現を絞り込むのに役立つかどうかを確認します。
Bungle

1
文字列に.split( '/')を使用したのは、それが私にとってより簡単な解決策だったからです。しかし、あなたの助けをありがとう!
Bungle

2
https URL?ホスト名がwwwで始まっていませんか?とにかくなぜwwwをキャプチャするのですか?
Tim Down

1
わかりません。OPはURLを取得する方法を尋ねました。彼の例では、httpとwwwがありました。
クレメントエレマン09/09/14

1

Webサイト内のパス(/my/path)、スキーマレス(//example.com/my/path)、フル(http://example.com/my/path)など、任意のURLの起源を取得するために、クイック関数を作成しました。

以下のスニペットでは、3つの呼び出しすべてがログに記録されますhttps://stacksnippets.net

function getOrigin(url)
{
  if(/^\/\//.test(url))
  { // no scheme, use current scheme, extract domain
    url = window.location.protocol + url;
  }
  else if(/^\//.test(url))
  { // just path, use whole origin
    url = window.location.origin + url;
  }
  return url.match(/^([^/]+\/\/[^/]+)/)[0];
}

console.log(getOrigin('https://stacksnippets.net/my/path'));
console.log(getOrigin('//stacksnippets.net/my/path'));
console.log(getOrigin('/my/path'));


0

これは私にとってはうまくいきます:

var getBaseUrl = function (url) {
  if (url) {
    var parts = url.split('://');
    
    if (parts.length > 1) {
      return parts[0] + '://' + parts[1].split('/')[0] + '/';
    } else {
      return parts[0].split('/')[0] + '/';
    }
  }
};


0
var tilllastbackslashregex = new RegExp(/^.*\//);
baseUrl = tilllastbackslashregex.exec(window.location.href);

window.location.hrefは、ブラウザーのアドレスバーから現在のURLアドレスを提供します

それはどのようなものになることができ https://stackoverflow.com/abc/xyzまたはhttps://www.google.com/search?q=abc tilllastbackslashregex.exec()の実行正規表現と最後のバックスラッシュまでマッチした文字列をretunすなわちHTTPS ://stackoverflow.com/abc/またはhttps://www.google.com/それぞれ


5
簡単な説明を追加してください。
Preet

6
レビューキューから:ソースコードの前後にコンテキストを追加してください。コードのみの回答は理解が困難です。投稿に情報を追加できれば、質問者と将来の読者の両方に役立ちます。
RBT 2019年

0

良い方法は、JavaScriptネイティブAPI URLオブジェクトを使用することです。これにより、多くの便利なURLパーツが提供されます。

例えば:

const url = '/programming/1420881/how-to-extract-base-url-from-a-string-in-javascript'

const urlObject = new URL(url);

console.log(urlObject);


// RESULT: 
//________________________________
hash: "",
host: "stackoverflow.com",
hostname: "stackoverflow.com",
href: "/programming/1420881/how-to-extract-base-url-from-a-string-in-javascript",
origin: "https://stackoverflow.com",
password: "",
pathname: "/questions/1420881/how-to-extract-base-url-from-a-string-in-javaript",
port: "",
protocol: "https:",
search: "",
searchParams: [object URLSearchParams]
... + some other methods

ここを見るとわかるように、必要なものにアクセスできます。

例えば: console.log(urlObject.host); // "stackoverflow.com"

URLのドキュメント

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.