Wie analysiere ich eine URL in Javascript in Hostname und Pfad?

379

Ich würde gerne eine Schnur nehmen

var a = "http://example.com/aa/bb/"

und verarbeiten Sie es zu einem Objekt, so dass

a.hostname == "example.com"

und

a.pathname == "/aa/bb"
Freddiefujiwara
quelle
11
Falls Sie auf der aktuellen URL arbeiten, können Sie zugreifen hostnameund pathnamedirekt aus dem locationObjekt.
Rvighne
1
was ist mit "lastPathPart"?
Victor
Nicht Regex, aber das Python-Modul tldextract macht genau das: github.com/john-kurkowski/tldextract
Oliver Oliver

Antworten:

395

Der moderne Weg:

new URL("http://example.com/aa/bb/")

Gibt ein Objekt mit Eigenschaften hostnameund pathnamezusammen mit einigen anderen zurück .

Das erste Argument ist eine relative oder absolute URL. Wenn es relativ ist, müssen Sie das zweite Argument (die Basis-URL) angeben. Zum Beispiel für eine URL relativ zur aktuellen Seite:

new URL("/aa/bb/", location)

Neben Browsern ist diese API seit Version 7 auch in Node.js verfügbarrequire('url').URL .

rvighne
quelle
7
Nett! Relative URLs brechen es aber ... :( new URL('/stuff?foo=bar#baz')->SyntaxError: Failed to construct 'URL': Invalid URL
lakenen
56
Experimentelle Technologie: IE unterstützt dies nicht! developer.mozilla.org/en-US/docs/Web/API/URL/…
cwouter
10
@cwouter: Es funktioniert jedoch in Edge, das IE
rvighne
4
Dies ist der Weg, um es zu tun, Rand ist bereits 3 Versionen über dh dh es spielt keine Rolle
Claudiu Creanga
7
Die Tatsache, dass JavaScript keine integrierte Methode zum Parsen von URLs hat, die auf Browsern oder Servern funktionieren, ist ziemlich traurig ...
Skitterm
365
var getLocation = function(href) {
    var l = document.createElement("a");
    l.href = href;
    return l;
};
var l = getLocation("http://example.com/path");
console.debug(l.hostname)
>> "example.com"
console.debug(l.pathname)
>> "/path"
Freddiefujiwara
quelle
14
Sind Sie sicher, dass dies eine browserübergreifende Lösung ist?
Cllpse
70
Es sollte beachtet werden, dass dies zwar dem Originalposter helfen / antworten kann, diese Antwort jedoch nur für Personen funktioniert, die JS in einem Browser ausführen, da das DOM für seine Arbeit erforderlich ist.
Adam Batkin
4
Ein weiteres Beispiel für Einfachheit neben Einfallsreichtum.
Saeed Neamati
26
Funktioniert nicht im IE, wenn die href relativ ist. Der Hostname ist leer. Wenn Sie nur vollständige URLs angeben, funktioniert dies.
Derek Prior
7
Selbst mit absoluten URLs verhält sich IE (getestet in IE 11) anders als Chrome und Firefox. IE's pathnameentfernt den führenden Schrägstrich, während die anderen Browser dies nicht tun. So werden Sie am Ende mit /pathoder path, je nach Ihrem Browser.
TrueWill
299

hier zu finden: https://gist.github.com/jlong/2428561

var parser = document.createElement('a');
parser.href = "http://example.com:3000/pathname/?search=test#hash";

parser.protocol; // => "http:"
parser.host;     // => "example.com:3000"
parser.hostname; // => "example.com"
parser.port;     // => "3000"
parser.pathname; // => "/pathname/"
parser.hash;     // => "#hash"
parser.search;   // => "?search=test"
parser.origin;   // => "http://example.com:3000"
Joseph Oster
quelle
11
Beachten Sie, dass, wenn Sie nur die analysierten Teile des aktuellen Browser-Speicherorts abrufen möchten, die ersten beiden Zeilen werden parser = location;und alle folgenden Zeilen funktionieren. Versuchte es gerade in Chrome und IE9.
Lee Meador
9
Beachten Sie auch, dass pathnameder führende Schrägstrich im IE nicht enthalten ist. Stelle dir das vor. : D
nevelis
3
Verwenden Sie für IE "/" + parser.pathname
sbose
Warnung: Es wird zurückgegeben, http:auch wenn Sie nur domain.coman href übergeben (ohne Protokoll). Ich wollte dies verwenden, um zu überprüfen, ob das Protokoll fehlte, und wenn ja, könnte ich es hinzufügen, aber es geht davon aus, dass http: so nicht in der Lage war, es für diesen Zweck zu verwenden.
Max Hodges
Der Hostname enthält tatsächlich das Protokoll. Testen Sie die neueste Version von Chrome.
AndroidDev
109

Hier ist eine einfache Funktion, die einen regulären Ausdruck verwendet, der das aTag-Verhalten imitiert .

Vorteile

  • vorhersehbares Verhalten (keine browserübergreifenden Probleme)
  • braucht das DOM nicht
  • es ist wirklich kurz.

Nachteile

  • Der reguläre Ausdruck ist etwas schwer zu lesen

- -

function getLocation(href) {
    var match = href.match(/^(https?\:)\/\/(([^:\/?#]*)(?:\:([0-9]+))?)([\/]{0,1}[^?#]*)(\?[^#]*|)(#.*|)$/);
    return match && {
        href: href,
        protocol: match[1],
        host: match[2],
        hostname: match[3],
        port: match[4],
        pathname: match[5],
        search: match[6],
        hash: match[7]
    }
}

- -

getLocation("http://example.com/");
/*
{
    "protocol": "http:",
    "host": "example.com",
    "hostname": "example.com",
    "port": undefined,
    "pathname": "/"
    "search": "",
    "hash": "",
}
*/

getLocation("http://example.com:3000/pathname/?search=test#hash");
/*
{
    "protocol": "http:",
    "host": "example.com:3000",
    "hostname": "example.com",
    "port": "3000",
    "pathname": "/pathname/",
    "search": "?search=test",
    "hash": "#hash"
}
*/

BEARBEITEN:

Hier ist eine Aufschlüsselung des regulären Ausdrucks

var reURLInformation = new RegExp([
    '^(https?:)//', // protocol
    '(([^:/?#]*)(?::([0-9]+))?)', // host (hostname and port)
    '(/{0,1}[^?#]*)', // pathname
    '(\\?[^#]*|)', // search
    '(#.*|)$' // hash
].join(''));
var match = href.match(reURLInformation);
Rems
quelle
4
Funktioniert nicht mit relativen URLs. Haben Sie RFC-3986 bei der Erstellung des regulären Ausdrucks befolgt? > getLocation ("// example.com/"); null> getLocation ("/ pathname /? search"); null> getLocation ("/ pathname /"); null> getLocation ("relativ"); null
gregers
2
Ich mag, wie dies nicht das DOM verwendet, aber Gregers hat einen guten Punkt. Es wäre schön, wenn dies relative Pfade handhaben könnte. Es würde erforderlich sein, window.location (ein a-Element) zu verwenden, um die Lücken auszufüllen und Code hinzuzufügen. In diesem Fall würde die Methode scheinheilig werden. Wenn es keine Alternative gibt, sind Sie sich nicht sicher, wie dies perfekt gelöst werden kann.
Turbo
Der href-Schlüssel mit der ursprünglichen URL wurde hinzugefügt, um die Konsistenz dieses Rückgabeobjekts mit der dom-Implementierung zu gewährleisten.
Mattdlockyer
2
Wenn jemand relative URLs analysieren muss, ist hier der aktualisierte reguläre Ausdruck: / ^ (? :( https? \ :) \ / \ /)? (([^: \ /? #] *) (?: \: ([0 -9] +))?) ([\ /] {0,1} [^? #] *) (\? [^ #] * |) (#. * |) $ /
shlensky
75
var loc = window.location;  // => "http://example.com:3000/pathname/?search=test#hash"

gibt die aktuelleUrl zurück.

Wenn Sie Ihre eigene Zeichenfolge als URL übergeben möchten ( funktioniert in IE11 nicht ):

var loc = new URL("http://example.com:3000/pathname/?search=test#hash")

Dann können Sie es wie folgt analysieren:

loc.protocol; // => "http:"
loc.host;     // => "example.com:3000"
loc.hostname; // => "example.com"
loc.port;     // => "3000"
loc.pathname; // => "/pathname/"
loc.hash;     // => "#hash"
loc.search;   // => "?search=test"
Peter Graham
quelle
60

Die Antwort von freddiefujiwara ist ziemlich gut, aber ich musste auch relative URLs in Internet Explorer unterstützen. Ich habe die folgende Lösung gefunden:

function getLocation(href) {
    var location = document.createElement("a");
    location.href = href;
    // IE doesn't populate all link properties when setting .href with a relative URL,
    // however .href will return an absolute URL which then can be used on itself
    // to populate these additional fields.
    if (location.host == "") {
      location.href = location.href;
    }
    return location;
};

Verwenden Sie es nun, um die erforderlichen Eigenschaften zu erhalten:

var a = getLocation('http://example.com/aa/bb/');
document.write(a.hostname);
document.write(a.pathname);

JSFiddle-Beispiel: http://jsfiddle.net/6AEAB/

Claus
quelle
4
Dies sollte die akzeptierte Antwort sein. Sehr clevere Verwendung der relativen bis absoluten URL-Behandlung. +1
L0j1k
Anscheinend nicht das erste Mal, dass ein JSFiddle-Link starb: stackoverflow.com/questions/25179964/…
Claus
3
Dies hat großartig funktioniert, aber ich hatte ein Update, von dem ich hoffe, dass es anderen helfen wird. Ich verwende dies, um den Ursprung einer postMessage-Anforderung zu überprüfen. Wenn der Port ein Standardport ist (80 oder 443), wird er nicht an den Pfad angehängt. Ich habe dies beim Erstellen meiner URL bedingt überprüft: var locationHost = (location.port !== '80' && location.port !== '443') ? location.host : location.hostname; var locationOrigin = location.protocol + '//' + locationHost;
Rhoster
2
Ich habe diesen Kommentar an anderer Stelle zu einer populäreren Variante dieser Lösung abgegeben, aber da dies meine Lieblingslösung war, wollte ich ihn hier wiederholen. In IE11 führt ein Benutzername in der href dazu, dass alle diese Eigenschaftslesevorgänge Sicherheitsfehler auslösen. Beispiel: " example.com " funktioniert einwandfrei. " [email protected] " oder " Benutzername: [email protected] " versuchen jedoch, auf eine der anderen Eigenschaften des Ankerelements (Beispiel: Hash) zu verweisen, um fehlzuschlagen und einen abscheulichen Fehler auszulösen.
Clippy
17

js-uri (verfügbar in Google Code) verwendet eine Zeichenfolgen-URL und löst ein URI-Objekt daraus auf:

var some_uri = new URI("http://www.example.com/foo/bar");

alert(some_uri.authority); // www.example.com
alert(some_uri);           // http://www.example.com/foo/bar

var blah      = new URI("blah");
var blah_full = blah.resolve(some_uri);
alert(blah_full);         // http://www.example.com/foo/blah
Rex M.
quelle
Vielen Dank!!! aber ich möchte uri = new Location (" example.com/aa/bb" ) typeof (window.location) == typeof (uri)
freddiefujiwara
Da window.location eine Zeichenfolge ist, sehe ich nicht wirklich, wie dies möglich oder hilfreich wäre. Warum müssen die Typen übereinstimmen, wenn Sie problemlos von einem zum anderen konvertieren können?
Rex M
developer.mozilla.org/en/DOM/window.location ist eine sehr schöne API !! Ich hoffe also, String in window.location-Objekt konvertieren
freddiefujiwara
1
Durch das Festlegen von window.location wird der Browser so geändert, dass dies nicht geschieht.
Epascarello
1
Hmm das stimmt. window.location ist keine Zeichenfolge, kann jedoch aus einer Zeichenfolge zugewiesen werden. Ich bin mir nicht sicher, ob dies nachgeahmt werden kann. Ich habe versucht, den Prototyp des Standorts einem neuen Uri-Objekt zuzuweisen, aber das hat nicht funktioniert.
Rex M
12

Was ist mit einfachen regulären Ausdrücken?

url = "http://www.example.com/path/to/somwhere";
urlParts = /^(?:\w+\:\/\/)?([^\/]+)(.*)$/.exec(url);
hostname = urlParts[1]; // www.example.com
path = urlParts[2]; // /path/to/somwhere
svestka
quelle
Versuchen Sie, etwas Gültiges wie zu analysieren, //user:[email protected]/path/x?y=zund Sie werden sehen, warum ein einfacher regulärer Ausdruck es nicht schneidet. Werfen Sie jetzt etwas Ungültiges hinein und es sollte auch auf vorhersehbare Weise aussteigen.
Mikko Rantalainen
Einfacher Regex ist für einfache Probleme :) Aber es hört sich für mich nicht so an, als ob eine solche URL von Regex nicht analysiert werden kann. Sie würde nur ein paar weitere Anpassungen benötigen. Aber ich würde wahrscheinlich in eine Bibliothek gehen, wenn ich etwas komplexeres und kugelsicheres brauche.
Svestka
12

Heute bin ich auf dieses Problem gestoßen und habe Folgendes gefunden: URL - MDN-Web-APIs

var url = new URL("http://test.example.com/dir/subdir/file.html#hash");

Diese Rückkehr:

{ hash:"#hash", host:"test.example.com", hostname:"test.example.com", href:"http://test.example.com/dir/subdir/file.html#hash", origin:"http://test.example.com", password:"", pathname:"/dir/subdir/file.html", port:"", protocol:"http:", search: "", username: "" }

Ich hoffe, mein erster Beitrag hilft dir!

A. Moynet
quelle
Doppelte Antwort
Martin van Driel
6
Ja, aber der Typ an der Spitze aktualisiert gerade sein awser im Jahr 2017, ich poste es im Jahr 2016.
A. Moynet
Ah mein schlechtes, sorry
Martin van Driel
9

Hier ist eine Version, die ich von https://gist.github.com/1847816 kopiert , aber neu geschrieben habe, damit sie leichter zu lesen und zu debuggen ist. Der Zweck des Kopierens der Ankerdaten in eine andere Variable mit dem Namen "Ergebnis" besteht darin, dass die Ankerdaten ziemlich lang sind. Wenn Sie also eine begrenzte Anzahl von Werten in das Ergebnis kopieren, wird das Ergebnis vereinfacht.

/**
 * See: https://gist.github.com/1847816
 * Parse a URI, returning an object similar to Location
 * Usage: var uri = parseUri("hello?search#hash")
 */
function parseUri(url) {

  var result = {};

  var anchor = document.createElement('a');
  anchor.href = url;

  var keys = 'protocol hostname host pathname port search hash href'.split(' ');
  for (var keyIndex in keys) {
    var currentKey = keys[keyIndex]; 
    result[currentKey] = anchor[currentKey];
  }

  result.toString = function() { return anchor.href; };
  result.requestUri = result.pathname + result.search;  
  return result;

}
Biagio Arobba
quelle
6

Browserübergreifendes URL-Parsen umgeht das relative Pfadproblem für IE 6, 7, 8 und 9:

function ParsedUrl(url) {
    var parser = document.createElement("a");
    parser.href = url;

    // IE 8 and 9 dont load the attributes "protocol" and "host" in case the source URL
    // is just a pathname, that is, "/example" and not "http://domain.com/example".
    parser.href = parser.href;

    // IE 7 and 6 wont load "protocol" and "host" even with the above workaround,
    // so we take the protocol/host from window.location and place them manually
    if (parser.host === "") {
        var newProtocolAndHost = window.location.protocol + "//" + window.location.host;
        if (url.charAt(1) === "/") {
            parser.href = newProtocolAndHost + url;
        } else {
            // the regex gets everything up to the last "/"
            // /path/takesEverythingUpToAndIncludingTheLastForwardSlash/thisIsIgnored
            // "/" is inserted before because IE takes it of from pathname
            var currentFolder = ("/"+parser.pathname).match(/.*\//)[0];
            parser.href = newProtocolAndHost + currentFolder + url;
        }
    }

    // copies all the properties to this object
    var properties = ['host', 'hostname', 'hash', 'href', 'port', 'protocol', 'search'];
    for (var i = 0, n = properties.length; i < n; i++) {
      this[properties[i]] = parser[properties[i]];
    }

    // pathname is special because IE takes the "/" of the starting of pathname
    this.pathname = (parser.pathname.charAt(0) !== "/" ? "/" : "") + parser.pathname;
}

Verwendung ( Demo JSFiddle hier ):

var myUrl = new ParsedUrl("http://www.example.com:8080/path?query=123#fragment");

Ergebnis:

{
    hash: "#fragment"
    host: "www.example.com:8080"
    hostname: "www.example.com"
    href: "http://www.example.com:8080/path?query=123#fragment"
    pathname: "/path"
    port: "8080"
    protocol: "http:"
    search: "?query=123"
}
acdcjunior
quelle
5

Für diejenigen, die nach einer modernen Lösung suchen, die in IE, Firefox UND Chrome funktioniert:

Keine dieser Lösungen, die ein Hyperlink-Element verwenden, funktioniert in Chrome gleich. Wenn Sie eine ungültige (oder leere) URL an Chrome übergeben, wird immer der Host zurückgegeben, von dem aus das Skript aufgerufen wird. In IE werden Sie also leer, während Sie in Chrome localhost (oder was auch immer) erhalten.

Wenn Sie versuchen, den Überweiser anzusehen, ist dies trügerisch. Sie sollten sicherstellen, dass der Host, den Sie zurückerhalten, in der ursprünglichen URL enthalten ist, um dies zu beheben:

    function getHostNameFromUrl(url) {
        // <summary>Parses the domain/host from a given url.</summary>
        var a = document.createElement("a");
        a.href = url;

        // Handle chrome which will default to domain where script is called from if invalid
        return url.indexOf(a.hostname) != -1 ? a.hostname : '';
    }
KingOfHypocrites
quelle
Dies ist eine sehr wichtige Sache zu berücksichtigen!
2rs2ts
Dies bricht jedoch die relativen URLs vollständig!
Lakenen
4

Der AngularJS-Weg - Geige hier: http://jsfiddle.net/PT5BG/4/

<!DOCTYPE html>
<html>
<head>
    <title>Parse URL using AngularJS</title>
</head>
<body ng-app ng-controller="AppCtrl" ng-init="init()">

<h3>Parse URL using AngularJS</h3>

url: <input type="text" ng-model="url" value="" style="width:780px;">

<ul>
    <li>href = {{parser.href}}</li>
    <li>protocol = {{parser.protocol}}</li>
    <li>host = {{parser.host}}</li>
    <li>hostname = {{parser.hostname}}</li>
    <li>port = {{parser.port}}</li>
    <li>pathname = {{parser.pathname}}</li>
    <li>hash = {{parser.hash}}</li>
    <li>search = {{parser.search}}</li>
</ul>

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.6/angular.min.js"></script>

<script>
function AppCtrl($scope) {

    $scope.$watch('url', function() {
        $scope.parser.href = $scope.url;
    });

    $scope.init = function() {
        $scope.parser = document.createElement('a');
        $scope.url = window.location;
    }

}
</script>

</body>
</html>
Joseph Oster
quelle
2
Es wird eckiger sein, wenn Sie $documentund $windowDienstleistungen verwenden
Cherniv
3

Einfache und robuste Lösung mit dem Modulmuster. Dies beinhaltet einen Fix für IE, bei dem pathnameder nicht immer einen führenden Schrägstrich ( /) hat.

Ich habe einen Gist zusammen mit einer JSFiddle erstellt, die einen dynamischeren Parser bietet. Ich empfehle Ihnen, es auszuprobieren und Feedback zu geben.

var URLParser = (function (document) {
    var PROPS = 'protocol hostname host pathname port search hash href'.split(' ');
    var self = function (url) {
        this.aEl = document.createElement('a');
        this.parse(url);
    };
    self.prototype.parse = function (url) {
        this.aEl.href = url;
        if (this.aEl.host == "") {
           this.aEl.href = this.aEl.href;
        }
        PROPS.forEach(function (prop) {
            switch (prop) {
                case 'hash':
                    this[prop] = this.aEl[prop].substr(1);
                    break;
                default:
                    this[prop] = this.aEl[prop];
            }
        }, this);
        if (this.pathname.indexOf('/') !== 0) {
            this.pathname = '/' + this.pathname;
        }
        this.requestUri = this.pathname + this.search;
    };
    self.prototype.toObj = function () {
        var obj = {};
        PROPS.forEach(function (prop) {
            obj[prop] = this[prop];
        }, this);
        obj.requestUri = this.requestUri;
        return obj;
    };
    self.prototype.toString = function () {
        return this.href;
    };
    return self;
})(document);

Demo

Ausgabe

{
 "protocol": "https:",
 "hostname": "www.example.org",
 "host": "www.example.org:5887",
 "pathname": "/foo/bar",
 "port": "5887",
 "search": "?a=1&b=2",
 "hash": "section-1",
 "href": "https://www.example.org:5887/foo/bar?a=1&b=2#section-1",
 "requestUri": "/foo/bar?a=1&b=2"
}
{
 "protocol": "ftp:",
 "hostname": "www.files.com",
 "host": "www.files.com:22",
 "pathname": "/folder",
 "port": "22",
 "search": "?id=7",
 "hash": "",
 "href": "ftp://www.files.com:22/folder?id=7",
 "requestUri": "/folder?id=7"
}
Mr. Polywhirl
quelle
3

Warum nicht benutzen?

        $scope.get_location=function(url_str){
        var parser = document.createElement('a');
        parser.href =url_str;//"http://example.com:3000/pathname/?search=test#hash";
        var info={
            protocol:parser.protocol,   
            hostname:parser.hostname, // => "example.com"
            port:parser.port,     // => "3000"
            pathname:parser.pathname, // => "/pathname/"
            search:parser.search,   // => "?search=test"
            hash:parser.hash,     // => "#hash"
            host:parser.host, // => "example.com:3000"      
        }
        return info;
    }
    alert( JSON.stringify( $scope.get_location("http://localhost:257/index.php/deploy/?asd=asd#asd"),null,4 ) );
Tanthuc
quelle
3

Sie können auch die parse_url()Funktion aus dem Locutus- Projekt (ehemals php.js) verwenden.

Code:

parse_url('http://username:password@hostname/path?arg=value#anchor');

Ergebnis:

{
  scheme: 'http',
  host: 'hostname',
  user: 'username',
  pass: 'password',
  path: '/path',
  query: 'arg=value',
  fragment: 'anchor'
}
Andrey Rudenko
quelle
1
Diese URL hat bei mir nicht funktioniert, aber ich habe sie hier gefunden. github.com/hirak/phpjs/blob/master/functions/url/parse_url.js
Stan Quinn
@StanQuinn, das liegt daran, dass php.js seinen Namen in Locutus geändert hat. Ich habe meine Antwort mit einem neuen Link aktualisiert.
Andrey Rudenko
3
function parseUrl(url) {
    var m = url.match(/^(([^:\/?#]+:)?(?:\/\/((?:([^\/?#:]*):([^\/?#:]*)@)?([^\/?#:]*)(?::([^\/?#:]*))?)))?([^?#]*)(\?[^#]*)?(#.*)?$/),
        r = {
            hash: m[10] || "",                   // #asd
            host: m[3] || "",                    // localhost:257
            hostname: m[6] || "",                // localhost
            href: m[0] || "",                    // http://username:password@localhost:257/deploy/?asd=asd#asd
            origin: m[1] || "",                  // http://username:password@localhost:257
            pathname: m[8] || (m[1] ? "/" : ""), // /deploy/
            port: m[7] || "",                    // 257
            protocol: m[2] || "",                // http:
            search: m[9] || "",                  // ?asd=asd
            username: m[4] || "",                // username
            password: m[5] || ""                 // password
        };
    if (r.protocol.length == 2) {
        r.protocol = "file:///" + r.protocol.toUpperCase();
        r.origin = r.protocol + "//" + r.host;
    }
    r.href = r.origin + r.pathname + r.search + r.hash;
    return m && r;
};
parseUrl("http://username:password@localhost:257/deploy/?asd=asd#asd");

Es funktioniert sowohl mit absoluten als auch mit relativen URLs

Nikolay
quelle
abc://username:[email protected]:123/path/data?key=value&key2=value2#fragid1
茶树 和 葡萄 树
@ 山 茶树 和 葡萄 树 Ich habe den Code aktualisiert, um die Unterkomponente userinfo ordnungsgemäß zu behandeln. Vielen Dank für Ihren Kommentar, ich habe dieses Problem vorher nicht bemerkt
Nikolay
liebe diesen Regex
Kunal
2

Hör auf, das Rad neu zu erfinden. Verwenden Sie https://github.com/medialize/URI.js/

var uri = new URI("http://example.org:80/foo/hello.html");
// get host
uri.host(); // returns string "example.org:80"
// set host
uri.host("example.org:80");
Hugo Sequeira
quelle
5
Denn jedes Mal, wenn Sie ein Problem lösen möchten ... eine Bibliothek verwenden? Okay ... (nicht)
jiminikiz
4
Nicht immer (eigentlich fast nie), aber URLs sind sehr schwierig zu analysieren. Die RFCs enthalten viele, viele Details. Verwenden Sie besser eine Bibliothek, die von Tausenden verwendet und getestet wurde.
Hugo Sequeira
Wie wäre es, wenn Sie nur das verwenden, was eingebaut ist, anstatt dass jemand anderes das Rad mit einer Bibliothek neu erfindet? Sehen stackoverflow.com/a/24006120/747739
Phil
Es gibt keine IE11-Unterstützung für die integrierte Funktion, daher ist diese Bibliothek hervorragend. Zu sagen, niemals eine Bibliothek zu benutzen, ist wie zu sagen, wir hätten niemals jQuery verwenden und nur nativen Code schreiben sollen, was absolut lächerlich ist. Jeder Entwickler hat einen anderen Anwendungsfall, es gibt keinen "besten" Weg, manchmal funktioniert Vanille / Native am besten, manchmal nicht ... etwas, das 92% der Entwickler noch lernen müssen.
tno2007
1

Verwenden Sie einfach die Bibliothek url.js (für web und node.js).

https://github.com/websanova/js-url

url: http://example.com?param=test#param=again

url('?param'); // test
url('#param'); // again
url('protocol'); // http
url('port'); // 80
url('domain'); // example.com
url('tld'); // com

etc...
rauben
quelle
1

Ein einfacher Hack mit der ersten Antwort

var getLocation = function(href=window.location.href) {
    var l = document.createElement("a");
    l.href = href;
    return l;
};

Dies kann auch ohne Argument verwendet werden, um den aktuellen Hostnamen zu ermitteln. getLocation (). Hostname gibt den aktuellen Hostnamen an

sooraj
quelle