Tôi muốn lấy một chuỗi
var a = "http://example.com/aa/bb/"
và xử lý nó thành một đối tượng sao cho
a.hostname == "example.com"
và
a.pathname == "/aa/bb"
Tôi muốn lấy một chuỗi
var a = "http://example.com/aa/bb/"
và xử lý nó thành một đối tượng sao cho
a.hostname == "example.com"
và
a.pathname == "/aa/bb"
Câu trả lời:
Cách hiện đại:
new URL("http://example.com/aa/bb/")
Trả về một đối tượng có thuộc tính hostname
và pathname
cùng với một vài đối tượng khác .
Đối số đầu tiên là một URL tương đối hoặc tuyệt đối; nếu nó tương đối, thì bạn cần chỉ định đối số thứ hai (URL cơ sở). Ví dụ: đối với một URL liên quan đến trang hiện tại:
new URL("/aa/bb/", location)
Ngoài các trình duyệt, API này cũng có sẵn trong Node.js kể từ v7, thông qua 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
loại bỏ dấu gạch chéo hàng đầu, trong khi các trình duyệt khác thì không. Vì vậy, bạn sẽ kết thúc với /path
hoặc path
, tùy thuộc vào trình duyệt của bạn.
tìm thấy ở đây: 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;
và tất cả các dòng sau hoạt động. Đã thử nó trong Chrome và IE9 ngay bây giờ.
pathname
không bao gồm dấu gạch chéo hàng đầu trong IE. Đi hình. : D
http:
ngay cả khi bạn chuyển qua domain.com
to href (không có bất kỳ giao thức nào). Tôi muốn sử dụng điều này để kiểm tra xem giao thức có bị thiếu hay không và nếu có thì tôi có thể thêm nó, nhưng nó giả sử http: vì vậy không thể sử dụng nó cho mục đích này.
Đây là một chức năng đơn giản bằng cách sử dụng biểu thức chính quy bắt chước a
hành vi thẻ.
Ưu
Nhược điểm
-
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"
}
*/
BIÊN TẬP:
Đây là một sự cố của biểu thức chính quy
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"
trả về currentUrl.
Nếu bạn muốn chuyển chuỗi của riêng mình dưới dạng url ( không hoạt động trong IE11 ):
var loc = new URL("http://example.com:3000/pathname/?search=test#hash")
Sau đó, bạn có thể phân tích nó như sau:
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"
Câu trả lời của freddiefujiwara khá hay nhưng tôi cũng cần hỗ trợ các URL tương đối trong Internet Explorer. Tôi đã đưa ra giải pháp sau đây:
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;
};
Bây giờ sử dụng nó để có được các thuộc tính cần thiết:
var a = getLocation('http://example.com/aa/bb/');
document.write(a.hostname);
document.write(a.pathname);
Ví dụ về JSFiddle: http://jsfiddle.net/6AEAB/
var locationHost = (location.port !== '80' && location.port !== '443') ? location.host : location.hostname;
var locationOrigin = location.protocol + '//' + locationHost;
js-uri (có sẵn trên Google Code) lấy URL chuỗi và giải quyết một đối tượng URI từ nó:
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
Những gì về biểu thức chính quy đơn giản?
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
và bạn sẽ thấy tại sao biểu thức chính quy đơn giản không cắt nó. Bây giờ hãy ném thứ gì đó không hợp lệ vào nó và nó cũng sẽ được bảo lãnh theo cách có thể dự đoán được.
hôm nay tôi gặp vấn đề này và tôi đã tìm thấy: URL - API Web MDN
var url = new URL("http://test.example.com/dir/subdir/file.html#hash");
Sự trở lại này:
{ 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: "" }
Hy vọng sự đóng góp đầu tiên của tôi sẽ giúp bạn!
Đây là phiên bản mà tôi đã sao chép từ https://gist.github.com/1847816 , nhưng được viết lại để dễ đọc và gỡ lỗi hơn. Mục đích của việc sao chép dữ liệu neo sang một biến khác có tên là "kết quả" là do dữ liệu neo khá dài và do đó sao chép một số lượng giá trị giới hạn vào kết quả sẽ giúp đơn giản hóa kết quả.
/**
* 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;
}
Phân tích cú pháp URL trình duyệt chéo , hoạt động xung quanh vấn đề đường dẫn tương đối cho IE 6, 7, 8 và 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;
}
Cách sử dụng ( bản demo JSFiddle tại đây ):
var myUrl = new ParsedUrl("http://www.example.com:8080/path?query=123#fragment");
Kết quả:
{
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"
}
Đối với những người tìm kiếm một giải pháp hiện đại hoạt động trong IE, Firefox và Chrome:
Không có giải pháp nào trong số này sử dụng phần tử siêu liên kết sẽ hoạt động giống nhau trong chrome.Nếu bạn chuyển một url không hợp lệ (hoặc trống) cho chrome, nó sẽ luôn trả về máy chủ nơi tập lệnh được gọi từ đó. Vì vậy, trong IE bạn sẽ trống, trong khi trong Chrome, bạn sẽ nhận được localhost (hoặc bất cứ thứ gì).
Nếu bạn đang cố gắng nhìn vào người giới thiệu, điều này là giả dối. Bạn sẽ muốn đảm bảo rằng máy chủ bạn nhận được nằm trong url gốc để xử lý việc này:
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 : '';
}
Cách AngularJS - fiddle tại đây: 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
và $window
dịch vụ
Giải pháp đơn giản và mạnh mẽ bằng cách sử dụng mô hình mô-đun. Điều này bao gồm một bản sửa lỗi cho IE trong pathname
đó không phải lúc nào cũng có dấu gạch chéo ( /
).
Tôi đã tạo một Gist cùng với một JSFiddle cung cấp trình phân tích cú pháp động hơn. Tôi khuyên bạn nên kiểm tra nó và cung cấp thông tin phản hồi.
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"
}
Sử dụng https://www.npmjs.com/package/uri-parse-lib cho việc này
var t = parserURI("http://user:pass@example.com:8080/directory/file.ext?query=1&next=4&sed=5#anchor");
Tại sao không sử dụng nó?
$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 ) );
Bạn cũng có thể sử dụng parse_url()
chức năng từ Locutus dự án (php.js cũ).
Mã số:
parse_url('http://username:password@hostname/path?arg=value#anchor');
Kết quả:
{
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");
Nó hoạt động với cả url tuyệt đối và tương đối
abc://username:password@example.com:123/path/data?key=value&key2=value2#fragid1
Dừng phát minh lại bánh xe. Sử dụng 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");
Chỉ cần sử dụng thư viện url.js (cho web và 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...
một hack đơn giản với câu trả lời đầu tiên
var getLocation = function(href=window.location.href) {
var l = document.createElement("a");
l.href = href;
return l;
};
điều này có thể được sử dụng ngay cả khi không có đối số để tìm ra tên máy chủ hiện tại getLocation (). tên máy chủ sẽ cung cấp tên máy chủ hiện tại
hostname
vàpathname
trực tiếp từlocation
đối tượng.