Làm cách nào để phân tích URL thành tên máy chủ và đường dẫn trong javascript?


379

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"

a.pathname == "/aa/bb"

11
Trong trường hợp bạn đang làm việc trên URL hiện tại, bạn có thể truy cập hostnamepathnametrực tiếp từ locationđối tượng.
rvighne

1
Thế còn "lastPathPart" thì sao?
Victor

Không phải regex nhưng Mô-đun Python tldextract thực hiện chính xác điều này: github.com/john-kurkowski/tldextract
Oliver Oliver

Câu trả lời:


395

Cách hiện đại:

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

Trả về một đối tượng có thuộc tính hostnamepathnamecù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.


7
Đẹp! Các URL tương đối phá vỡ nó mặc dù ... :( new URL('/stuff?foo=bar#baz')->SyntaxError: Failed to construct 'URL': Invalid URL
lakenen

56
Công nghệ thử nghiệm: IE không hỗ trợ điều này! developer.mozilla.org/en-US/docs/Web/API/URL/,
cwouter 18/03/2015

10
@cwouter: Tuy nhiên, nó hoạt động trong Edge, thay thế IE
rvighne

4
Đây là cách để làm điều đó, cạnh đã có 3 phiên bản trên cùng, vì vậy nó không thành vấn đề
Claudiu Creanga

7
Thực tế là JavaScript không có cách tích hợp để phân tích các URL hoạt động trên trình duyệt hoặc máy chủ khá buồn ...
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"

14
Bạn có chắc chắn đây là một giải pháp tương thích với nhiều trình duyệt?
cllpse

70
Cần lưu ý rằng, mặc dù điều này có thể giúp / trả lời người đăng ban đầu, nhưng câu trả lời này sẽ chỉ hoạt động đối với những người làm công việc JS trên trình duyệt, vì nó dựa vào DOM để thực hiện công việc của mình.
Adam Batkin

4
Một ví dụ khác về sự đơn giản, bên cạnh sự khéo léo.
Saeed Neamati

26
Không hoạt động trong IE nếu href tương đối. l.hostname sẽ trống. Nếu bạn chỉ cung cấp URL đầy đủ thì điều này sẽ hoạt động.
Derek Trước

7
Ngay cả với các URL tuyệt đối, IE (được thử nghiệm trong IE 11) hoạt động khác với Chrome và Firefox. IE pathnameloạ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 /pathhoặc path, tùy thuộc vào trình duyệt của bạn.
TrueWill

299

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"

11
Lưu ý rằng nếu bạn chỉ muốn lấy các phần được phân tích cú pháp của vị trí trình duyệt hiện tại, hai dòng đầu tiên sẽ trở thành parser = location;và tất cả các dòng sau hoạt động. Đã thử nó trong Chrome và IE9 ngay bây giờ.
Lee Meador

9
Cũng lưu ý rằng pathnamekhông bao gồm dấu gạch chéo hàng đầu trong IE. Đi hình. : D
nevelis

3
Đối với IE, sử dụng "/" + Parser.pathname
sbose

Cảnh báo: nó sẽ trả về http:ngay cả khi bạn chuyển qua domain.comto 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.
Max Hodges

Tên máy chủ thực sự bao gồm giao thức. Thử nghiệm trên phiên bản Chrome mới nhất.
AndroidDev

109

Đâ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

  • hành vi có thể dự đoán được (không có sự cố trình duyệt chéo)
  • không cần DOM
  • nó thực sự ngắn

Nhược điểm

  • Bản regrec hơi khó đọc

-

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);

4
Không hoạt động với bất kỳ URL tương đối. Bạn đã theo dõi RFC-3986 khi thực hiện regrec? > getLocation ("// example.com/"); null> getLocation ("/ tên đường dẫn /? tìm kiếm"); null> getLocation ("/ tên đường dẫn /"); null> getLocation ("tương đối"); null
gregers

2
Tôi thích cách này không sử dụng DOM, nhưng gregers có một điểm tốt. Sẽ thật tốt nếu điều này có thể xử lý các đường dẫn tương đối. Nó sẽ yêu cầu sử dụng window.location (một phần tử) để điền vào chỗ trống và thêm mã. Trong trường hợp đó, phương pháp sẽ trở nên đạo đức giả. Trừ khi có một giải pháp thay thế, không chắc làm thế nào điều này có thể được giải quyết một cách hoàn hảo.
Turbo

Đã thêm khóa href với url gốc, điều này cung cấp tính nhất quán trên đối tượng trả về đó với việc triển khai dom.
mattdlockyer

2
Nếu ai đó cần phân tích các URL tương đối ở đây là regrec cập nhật: / ^ (? :( https? \ :) \ / \ /)? (([^: \ /? #] *) (?: \: ([0 -9] +))?) ([\ /] {0,1} [^? #] *) (\? [^ #] * |) (#. * |) $ /
shlensky

75
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"

60

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/


4
Đây phải là câu trả lời được chấp nhận. Sử dụng rất thông minh việc xử lý URL tương đối đến tuyệt đối. +1
L0j1k

Rõ ràng không phải là lần đầu tiên một liên kết JSFiddle bị chết: stackoverflow.com/questions/25179964/iêu
Claus

3
Điều này làm việc rất tốt, tuy nhiên tôi đã có một bản cập nhật mà tôi hy vọng sẽ giúp được người khác. Tôi đang sử dụng điều này để kiểm tra nguồn gốc theo yêu cầu postMessage và khi cổng là cổng mặc định (80 hoặc 443), nó sẽ không được thêm vào đường dẫn. Tôi đã kiểm tra một cách có điều kiện khi tạo URL của mình: var locationHost = (location.port !== '80' && location.port !== '443') ? location.host : location.hostname; var locationOrigin = location.protocol + '//' + locationHost;
rhoster

2
Tôi đã đưa ra nhận xét này ở nơi khác về một biến thể phổ biến hơn của giải pháp này, nhưng vì đây là giải pháp yêu thích của tôi, tôi muốn nhắc lại ở đây. Trong IE11, việc có tên người dùng trong href sẽ khiến tất cả các thuộc tính này đọc bị lỗi bảo mật. Ví dụ: " example.com " sẽ hoạt động tốt. Nhưng " username@www.example.com " hoặc " username: password@www.example.com " sẽ khiến mọi nỗ lực tham chiếu một trong các thuộc tính khác của phần tử neo (ví dụ: hàm băm) không thành công và gây ra lỗi đáng ghét.
Clippy

17

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

cảm ơn!!! nhưng tôi muốn uri = new Location (" example.com/aa/bb" ) typeof (window.location) == typeof (uri)
freddiefujiwara

Vì window.location là một chuỗi, tôi không thực sự thấy điều đó có thể hoặc hữu ích như thế nào. Tại sao các loại cần phải khớp khi bạn có thể dễ dàng chuyển đổi từ loại này sang loại khác?
Rex M

developer.mozilla.org/en/DOM/window.location là api rất hay !! vì vậy tôi hy vọng chuyển đổi String thành đối tượng window.location
freddiefujiwara

1
Cài đặt window.location thay đổi trình duyệt để nó không xảy ra.
eprebello

1
Hmm đúng vậy. window.location không phải là một chuỗi, nhưng có thể được gán từ một chuỗi. Tôi không chắc có thể bắt chước được không, tôi đã thử gán nguyên mẫu vị trí cho một đối tượng uri mới nhưng điều đó không hiệu quả.
Rex M

12

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

Hãy thử phân tích một cái gì đó hợp lệ như thế nào //user:password@example.com/path/x?y=zvà 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.
Mikko Rantalainen

Regex đơn giản chỉ dành cho các vấn đề đơn giản :) Nhưng đối với tôi, url như thế này là không thể chỉnh sửa được bởi regex, nó sẽ chỉ cần thêm vài điều chỉnh. Nhưng có lẽ tôi sẽ đi đến một số thư viện nếu tôi cần một cái gì đó phức tạp hơn và đạn.
svestka

12

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!


Câu trả lời trùng lặp
Martin van Driel

6
Vâng, nhưng anh chàng đứng đầu chỉ cập nhật awser của anh ấy vào năm 2017, tôi sẽ đăng nó vào năm 2016.
A. Moynet

Ôi trời, xin lỗi
Martin van Driel

9

Đâ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;

}

6

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"
}

5

Đố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 : '';
    }

Đây là một điều rất quan trọng để xem xét!
2rs2ts

Điều này hoàn toàn phá vỡ các url tương đối, mặc dù!
mất

4

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>

2
Sẽ góc cạnh hơn nếu bạn sử dụng $document$windowdịch vụ
Cherniv

3

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);

Bản giới thiệu

Đầu ra

{
 "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"
}


3

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 ) );

3

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'
}

1
url đó không hoạt động với tôi, nhưng tôi đã tìm thấy nó ở đây github.com/hirak/phpjs/blob/master/fifts/url/parse_url.js
Stan Quinn

@StanQuinn, đó là vì php.js đã đổi tên thành Locutus. Tôi đã cập nhật câu trả lời của tôi với liên kết mới.
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");

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
山 茶树 和 葡萄

@ 山 茶树 和 葡萄 Tôi đã cập nhật mã để xử lý thành phần phụ userinfo đúng cách. Cảm ơn bình luận của bạn, tôi đã không nhận thấy vấn đề đó trước đây
Nikolay

thích regex này
Kunal

2

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");

5
Bởi vì mỗi khi bạn muốn giải quyết vấn đề ... hãy sử dụng thư viện? Được rồi ... (không)
jiminikiz

4
Không phải luôn luôn (thực sự gần như không bao giờ) nhưng URL rất khó phân tích, có nhiều chi tiết trong RFC. Tốt hơn để sử dụng một thư viện đã được sử dụng và kiểm tra bởi hàng ngàn.
Hugo Sequeira

Làm thế nào về việc chỉ sử dụng những gì được xây dựng trong, thay vì nhờ người khác phát minh lại bánh xe với một thư viện? Xem stackoverflow.com/a/24006120/747739
Phil

Không có hỗ trợ IE11 cho chức năng tích hợp, vì vậy thư viện này rất tuyệt vời. Nói không bao giờ sử dụng thư viện cũng giống như nói rằng chúng ta không bao giờ nên sử dụng jQuery và chỉ viết mã gốc, điều này hoàn toàn vô lý. Mỗi nhà phát triển có một trường hợp sử dụng khác nhau, không có cách 'tốt nhất', đôi khi vanilla / bản địa hoạt động tốt nhất, đôi khi nó không ... điều mà 92% các nhà phát triển vẫn phải học.
tno2007

1

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...

1

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.