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"
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"
Antworten:
Der moderne Weg:
new URL("http://example.com/aa/bb/")
Gibt ein Objekt mit Eigenschaften hostname
und pathname
zusammen 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
.
new URL('/stuff?foo=bar#baz')
->SyntaxError: Failed to construct 'URL': Invalid URL
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"
pathname
entfernt den führenden Schrägstrich, während die anderen Browser dies nicht tun. So werden Sie am Ende mit /path
oder path
, je nach Ihrem Browser.
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"
parser = location;
und alle folgenden Zeilen funktionieren. Versuchte es gerade in Chrome und IE9.
pathname
der führende Schrägstrich im IE nicht enthalten ist. Stelle dir das vor. : D
http:
auch wenn Sie nur domain.com
an 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.
Hier ist eine einfache Funktion, die einen regulären Ausdruck verwendet, der das a
Tag-Verhalten imitiert .
Vorteile
Nachteile
- -
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);
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"
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/
var locationHost = (location.port !== '80' && location.port !== '443') ? location.host : location.hostname;
var locationOrigin = location.protocol + '//' + locationHost;
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
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
//user:password@example.com/path/x?y=z
und 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.
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!
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;
}
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"
}
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 : '';
}
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>
$document
und $window
Dienstleistungen verwenden
Einfache und robuste Lösung mit dem Modulmuster. Dies beinhaltet einen Fix für IE, bei dem pathname
der 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);
{
"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"
}
Verwenden Sie https://www.npmjs.com/package/uri-parse-lib für diese
var t = parserURI("http://user:pass@example.com:8080/directory/file.ext?query=1&next=4&sed=5#anchor");
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 ) );
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'
}
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
abc://username:password@example.com:123/path/data?key=value&key2=value2#fragid1
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");
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...
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
hostname
undpathname
direkt aus demlocation
Objekt.