Saya ingin mengambil string
var a = "http://example.com/aa/bb/"
dan mengolahnya menjadi objek sedemikian rupa
a.hostname == "example.com"
dan
a.pathname == "/aa/bb"
Saya ingin mengambil string
var a = "http://example.com/aa/bb/"
dan mengolahnya menjadi objek sedemikian rupa
a.hostname == "example.com"
dan
a.pathname == "/aa/bb"
Jawaban:
Cara modern:
new URL("http://example.com/aa/bb/")
Mengembalikan objek dengan properti hostname
dan pathname
, bersama dengan beberapa lainnya .
Argumen pertama adalah URL relatif atau absolut; jika itu relatif, maka Anda perlu menentukan argumen kedua (URL dasar). Misalnya, untuk URL relatif ke halaman saat ini:
new URL("/aa/bb/", location)
Selain browser, API ini juga tersedia di Node.js sejak v7, hingga require('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
menghapus slash utama, sementara browser lain tidak. Jadi Anda akan berakhir dengan /path
atau path
, tergantung pada browser Anda.
ditemukan di sini: 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;
dan semua baris berikut berfungsi. Sudah mencoba di Chrome dan IE9 sekarang.
pathname
tidak termasuk garis miring di IE. Sosok pergi. : D
http:
bahkan jika Anda lulus hanya domain.com
ke href (tanpa protokol apa pun). Saya ingin menggunakan ini untuk memeriksa apakah protokolnya hilang, dan jika demikian saya bisa menambahkannya, tetapi mengasumsikan http: jadi tidak dapat menggunakannya untuk tujuan ini.
Berikut adalah fungsi sederhana menggunakan regexp yang meniru a
perilaku tag.
Pro
Cons
-
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"
}
*/
EDIT:
Berikut ini rincian ekspresi reguler
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"
mengembalikan currentUrl.
Jika Anda ingin meneruskan string Anda sebagai url ( tidak berfungsi di IE11 ):
var loc = new URL("http://example.com:3000/pathname/?search=test#hash")
Maka Anda dapat menguraikannya seperti:
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"
Jawaban freddiefujiwara cukup bagus tetapi saya juga perlu mendukung URL relatif dalam Internet Explorer. Saya datang dengan solusi berikut:
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;
};
Sekarang gunakan untuk mendapatkan properti yang dibutuhkan:
var a = getLocation('http://example.com/aa/bb/');
document.write(a.hostname);
document.write(a.pathname);
Contoh JSFiddle: http://jsfiddle.net/6AEAB/
var locationHost = (location.port !== '80' && location.port !== '443') ? location.host : location.hostname;
var locationOrigin = location.protocol + '//' + locationHost;
js-uri (tersedia di Google Code) mengambil URL string dan menyelesaikan objek URI darinya:
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
Bagaimana dengan ekspresi reguler sederhana?
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
dan Anda akan melihat mengapa ekspresi reguler yang sederhana tidak memotongnya. Sekarang melempar sesuatu yang tidak valid ke dalamnya dan itu harus menyelamatkan dengan cara yang dapat diprediksi juga.
hari ini saya menemukan masalah ini dan saya menemukan: URL - MDN Web APIs
var url = new URL("http://test.example.com/dir/subdir/file.html#hash");
Pengembalian ini:
{ 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: "" }
Berharap kontribusi pertama saya membantu Anda!
Ini adalah versi yang saya salin dari https://gist.github.com/1847816 , tetapi ditulis ulang sehingga lebih mudah untuk dibaca dan didebug. Tujuan menyalin data jangkar ke variabel lain bernama "hasil" adalah karena data jangkar cukup panjang, dan dengan demikian menyalin sejumlah nilai ke hasil akan membantu menyederhanakan hasil.
/**
* 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;
}
Penguraian URL lintas-browser , bekerja di sekitar masalah jalur relatif untuk IE 6, 7, 8 dan 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;
}
Penggunaan ( demo JSFiddle di sini ):
var myUrl = new ParsedUrl("http://www.example.com:8080/path?query=123#fragment");
Hasil:
{
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"
}
Bagi mereka yang mencari solusi modern yang berfungsi di IE, Firefox, DAN Chrome:
Tidak satu pun dari solusi ini yang menggunakan elemen hyperlink akan berfungsi sama di chrome.Jika Anda memberikan url yang tidak valid (atau kosong) ke chrome, itu akan selalu mengembalikan host tempat skrip dipanggil. Jadi di IE Anda akan mendapatkan kosong, sedangkan di Chrome Anda akan mendapatkan localhost (atau apa pun).
Jika Anda mencoba melihat pengarah, ini menipu. Anda harus memastikan bahwa host yang Anda dapatkan ada di url asli untuk menangani ini:
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 : '';
}
Cara AngularJS - biola di sini: 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
dan $window
layanan
Solusi sederhana dan kuat menggunakan pola modul. Ini termasuk perbaikan untuk IE di mana pathname
tidak selalu memiliki forward-slash ( /
).
Saya telah membuat Gist bersama dengan JSFiddle yang menawarkan parser yang lebih dinamis. Saya sarankan Anda memeriksanya dan memberikan umpan balik.
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"
}
Gunakan https://www.npmjs.com/package/uri-parse-lib untuk ini
var t = parserURI("http://user:pass@example.com:8080/directory/file.ext?query=1&next=4&sed=5#anchor");
Kenapa tidak menggunakannya?
$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 ) );
Anda juga dapat menggunakan parse_url()
fungsi dari Locutus proyek (mantan php.js).
Kode:
parse_url('http://username:password@hostname/path?arg=value#anchor');
Hasil:
{
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");
Ia berfungsi dengan url absolut dan relatif
abc://username:password@example.com:123/path/data?key=value&key2=value2#fragid1
Berhenti menciptakan kembali roda. Gunakan 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");
Cukup gunakan pustaka url.js (untuk web dan 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...
hack sederhana dengan jawaban pertama
var getLocation = function(href=window.location.href) {
var l = document.createElement("a");
l.href = href;
return l;
};
ini dapat digunakan bahkan tanpa argumen untuk mengetahui getLocation nama host saat ini (). nama host akan memberikan nama host saat ini
hostname
danpathname
langsung darilocation
objek.