İp almak istiyorum
var a = "http://example.com/aa/bb/"
ve bir nesneye dönüştürerek
a.hostname == "example.com"
ve
a.pathname == "/aa/bb"
İp almak istiyorum
var a = "http://example.com/aa/bb/"
ve bir nesneye dönüştürerek
a.hostname == "example.com"
ve
a.pathname == "/aa/bb"
Yanıtlar:
Modern yol:
new URL("http://example.com/aa/bb/")
Özelliklere sahip bir nesne döndürür hostname
ve pathname
birlikte birkaç diğerleri .
İlk argüman göreceli veya mutlak bir URL'dir; göreli ise, ikinci bağımsız değişkeni (temel URL) belirtmeniz gerekir. Örneğin, geçerli sayfaya göre bir URL için:
new URL("/aa/bb/", location)
Tarayıcılara ek olarak, bu API, v7'den bu yana Node.js'de de kullanılabilirrequire('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
Diğer tarayıcılar değil IE , önde gelen eğik çizgi kaldırır. Böylece tarayıcınıza bağlı olarak /path
veya ile sonuçlanırsınız path
.
burada bulundu: 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;
ve sonraki tüm satırların çalıştığını unutmayın. Chrome ve IE9'da şimdi denedim.
pathname
IE'de eğik çizgi içermediğini unutmayın . Git şekil. : D
http:
sadece domain.com
href'e geçseniz bile (herhangi bir protokol olmadan) dönecektir . Protokol eksik olup olmadığını kontrol etmek için bunu kullanmak istedim ve eğer öyleyse ekleyebilirsiniz, ama http: bu nedenle bu amaç için kullanamadığı varsayıyor.
Burada, a
etiket davranışını taklit eden bir regexp kullanan basit bir işlev var .
Artıları
Eksileri
-
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"
}
*/
DÜZENLE:
İşte düzenli ifadenin dökümü
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"
currentUrl öğesini döndürür.
Kendi dizenizi URL olarak geçirmek istiyorsanız ( IE11'de çalışmaz ):
var loc = new URL("http://example.com:3000/pathname/?search=test#hash")
Sonra aşağıdaki gibi ayrıştırabilirsiniz:
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"
freddiefujiwara'nın yanıtı oldukça iyi, ancak Internet Explorer'da göreli URL'leri de desteklemem gerekiyordu. Aşağıdaki çözümü buldum:
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;
};
Şimdi gerekli özellikleri almak için kullanın:
var a = getLocation('http://example.com/aa/bb/');
document.write(a.hostname);
document.write(a.pathname);
JSFiddle örneği: http://jsfiddle.net/6AEAB/
var locationHost = (location.port !== '80' && location.port !== '443') ? location.host : location.hostname;
var locationOrigin = location.protocol + '//' + locationHost;
js-uri (Google Code'da bulunur) bir dize URL'si alır ve bundan bir URI nesnesini çözer:
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
Basit düzenli ifade ne olacak?
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
ve neden basit düzenli ifadenin onu kesmediğini göreceksiniz. Şimdi ona geçersiz bir şey atın ve tahmin edilebilir bir şekilde kurtarılmalıdır.
Bugün bu sorunu karşılıyorum ve buldum: URL - MDN Web API'leri
var url = new URL("http://test.example.com/dir/subdir/file.html#hash");
Bu dönüş:
{ 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: "" }
İlk katkımın size yardımcı olacağını umuyoruz!
İşte https://gist.github.com/1847816 adresinden kopyaladığım bir sürüm , ancak yeniden yazıldığından okunması ve hata ayıklaması daha kolay. Bağlantı verilerinin "sonuç" adlı başka bir değişkene kopyalanmasının amacı, bağlantı verilerinin oldukça uzun olması ve bu nedenle sonuca sınırlı sayıda değerin kopyalanmasının sonucu basitleştirmeye yardımcı olmasıdır.
/**
* 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;
}
Tarayıcılar arası URL ayrıştırma , IE 6, 7, 8 ve 9 için göreli yol sorununun etrafında çalışır :
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;
}
Kullanımı ( demo JSFiddle burada ):
var myUrl = new ParsedUrl("http://www.example.com:8080/path?query=123#fragment");
Sonuç:
{
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"
}
IE, Firefox ve Chrome'da çalışan modern bir çözüm arayanlar için:
Köprü öğesi kullanan bu çözümlerin hiçbiri kromda aynı şekilde çalışmaz.Chrome'a geçersiz (veya boş) bir URL iletirseniz, komut dosyasının her zaman çağrıldığı ana bilgisayarı döndürür. Yani IE'de boş, Chrome'da localhost (ya da her neyse) alacaksınız.
Yönlendirene bakmaya çalışıyorsanız, bu aldatıcıdır. Geri döndüğünüz ana bilgisayarın, bununla başa çıkmak için orijinal URL'de olduğundan emin olmak istersiniz:
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 : '';
}
AngularJS yolu - burada keman: 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
ve $window
hizmet edecek daha açısal olacak
Modül desenini kullanarak basit ve sağlam çözüm. Bu, pathname
her zaman önde gelen eğik çizgi ( /
) bulunmayan IE için bir düzeltme içerir .
Daha dinamik bir ayrıştırıcı sunan bir JSFiddle ile birlikte bir Gist oluşturdum . Kontrol etmenizi ve geri bildirimde bulunmanızı öneririm.
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"
}
Bunun için https://www.npmjs.com/package/uri-parse-lib kullanın
var t = parserURI("http://user:pass@example.com:8080/directory/file.ext?query=1&next=4&sed=5#anchor");
Neden kullanmıyorsunuz?
$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 ) );
Ayrıca kullanabilirsiniz parse_url()
gelen işlevi Locutus projesi (eski php.js).
Kod:
parse_url('http://username:password@hostname/path?arg=value#anchor');
Sonuç:
{
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");
Hem mutlak hem de göreli URL'lerle çalışır
abc://username:password@example.com:123/path/data?key=value&key2=value2#fragid1
Tekerleği yeniden icat etmeyi bırakın. Https://github.com/medialize/URI.js/ kullanın
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");
Sadece url.js kütüphanesini kullanın (web ve node.js için).
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...
ilk cevapla basit bir saldırı
var getLocation = function(href=window.location.href) {
var l = document.createElement("a");
l.href = href;
return l;
};
Geçerli ana bilgisayar adı dışarı rakama bile argüman olmadan kullanılabilir bu kutu getLocation (). hostname mevcut ana makine adını verecek
hostname
vepathname
doğrudanlocation
nesne.