ฉันจะแยก URL เป็นชื่อโฮสต์และพา ธ ใน javascript ได้อย่างไร


379

ฉันต้องการรับสาย

var a = "http://example.com/aa/bb/"

และประมวลผลเป็นวัตถุเช่นนั้น

a.hostname == "example.com"

และ

a.pathname == "/aa/bb"

11
ในกรณีที่คุณทำงานกับ URL ปัจจุบันคุณสามารถเข้าถึงhostnameและpathnameโดยตรงจากlocationวัตถุ
rvighne

1
สิ่งที่เกี่ยวกับ "lastPathPart"?
วิกเตอร์

ไม่ regex แต่ tldextract หลามโมดูลไม่ตรงนี้: github.com/john-kurkowski/tldextract
โอลิเวอร์โอลิเวอร์

คำตอบ:


395

วิธีการที่ทันสมัย:

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

ส่งคืนวัตถุที่มีคุณสมบัติhostnameและpathnameพร้อมกับคนอื่น ๆ

อาร์กิวเมนต์แรกคือ URL แบบสัมพัทธ์หรือสัมบูรณ์ หากเป็นแบบสัมพัทธ์คุณจะต้องระบุอาร์กิวเมนต์ที่สอง (URL หลัก) ตัวอย่างเช่นสำหรับ URL ที่เกี่ยวข้องกับหน้าปัจจุบัน:

new URL("/aa/bb/", location)

นอกเหนือไปจากเบราว์เซอร์, API นี้ยังมีอยู่ใน Node.jsตั้งแต่ v7 require('url').URLผ่าน


7
ดี! URL สัมพัทธ์จะทำลายแม้ว่า ... :( new URL('/stuff?foo=bar#baz')->SyntaxError: Failed to construct 'URL': Invalid URL
lakenen

56
เทคโนโลยีทดลอง: IE ไม่รองรับสิ่งนี้! developer.mozilla.org/en-US/docs/Web/API/URL/…
cwouter

10
@cwouter: มันทำงานได้ใน Edge แต่แทนที่ IE
rvighne

4
นี่คือวิธีที่จะทำมัน edge มีอยู่แล้ว 3 เวอร์ชันที่ด้านบนของ ie ดังนั้นมันจึงไม่สำคัญ
Claudiu Creanga

7
ความจริงที่ว่า JavaScript ไม่ได้มีตัวในทางที่จะแยก URL ที่ที่ทำงานบนเบราว์เซอร์หรือเซิร์ฟเวอร์เป็นเรื่องน่าเศร้าสวย ...
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
คุณแน่ใจหรือว่านี่เป็นโซลูชันที่ทำงานร่วมกันได้กับเบราว์เซอร์
cllpse

70
ควรสังเกตว่าในขณะที่สิ่งนี้อาจช่วย / ตอบผู้โพสต์ต้นฉบับคำตอบนี้จะใช้ได้เฉพาะกับคนที่ทำงาน JS ในเบราว์เซอร์เนื่องจากอาศัย DOM เพื่อทำงานของมัน
Adam Batkin

4
อีกตัวอย่างของความเรียบง่ายพร้อมกับความเฉลียวฉลาด
Saeed Neamati

26
ไม่ทำงานใน IE หาก href สัมพันธ์กัน l.hostname จะว่างเปล่า หากคุณเพียงแค่ให้ URL แบบเต็มระบบจะใช้งานได้
ดีเร็กก่อน

7
แม้จะมี URL ที่แน่นอน IE (ทดสอบใน IE 11) จะทำงานแตกต่างจาก Chrome และ Firefox IE pathnameลบเครื่องหมายทับชั้นนำในขณะที่เบราว์เซอร์อื่นไม่ทำ ดังนั้นคุณจะจบลงด้วย/pathหรือpathขึ้นอยู่กับเบราว์เซอร์ของคุณ
TrueWill

299

พบได้ที่นี่: 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
โปรดทราบว่าหากคุณต้องการแยกส่วนของตำแหน่งเบราว์เซอร์ปัจจุบันสองบรรทัดแรกจะกลายเป็นparser = location;และบรรทัดต่อไปนี้ทั้งหมดทำงาน ลองใช้งานใน Chrome และ IE9 แล้วตอนนี้
Lee Meador

9
โปรดทราบว่าpathnameไม่รวมเครื่องหมายสแลชชั้นนำใน IE ไปคิด : D
nevelis

3
สำหรับ IE ให้ใช้ "/" + parser.pathname
sbose

คำเตือน: มันจะกลับมาhttp:แม้ว่าคุณจะผ่านdomain.comไปยัง href (โดยไม่มีโปรโตคอลใด ๆ ) ฉันต้องการใช้สิ่งนี้เพื่อตรวจสอบว่าโปรโตคอลหายไปหรือไม่และถ้าเป็นเช่นนั้นฉันสามารถเพิ่มได้ แต่จะถือว่า http: ดังนั้นจึงไม่สามารถใช้เพื่อวัตถุประสงค์นี้ได้
Max Hodges

ชื่อโฮสต์รวมโปรโตคอลจริงๆแล้ว ทดสอบ Chrome เวอร์ชันล่าสุด
AndroidDev

109

นี่คือฟังก์ชั่นที่เรียบง่ายโดยใช้ regexp ที่เลียนแบบaพฤติกรรมแท็ก

ข้อดี

  • พฤติกรรมที่คาดเดาได้ (ไม่มีปัญหาเบราว์เซอร์ข้าม)
  • ไม่ต้องการ DOM
  • มันสั้นจริงๆ

จุดด้อย

  • regexp อ่านยากนิดหน่อย

-

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

แก้ไข:

นี่คือรายละเอียดของการแสดงออกปกติ

var reURLInformation = new RegExp([
    '^(https?:)//', // protocol
    '(([^:/?#]*)(?::([0-9]+))?)', // host (hostname and port)
    '(/{0,1}[^?#]*)', // pathname
    '(\\?[^#]*|)', // search
    '(#.*|)$' // hash
].join(''));
var match = href.match(reURLInformation);

4
ไม่ทำงานกับ URL สัมพัทธ์ใด ๆ คุณติดตาม RFC-3986 เมื่อทำการ regexp หรือไม่ > getLocation ("// example.com/"); null> getLocation ("/ pathname /? search"); null> getLocation ("/ pathname /"); null> getLocation ("ญาติ"); null
gregers

2
ฉันชอบวิธีนี้ไม่ใช้ DOM แต่ gregers มีจุดดี มันจะดีถ้าสิ่งนี้สามารถจัดการกับเส้นทางญาติ มันจะต้องใช้ window.location (องค์ประกอบ) เพื่อกรอกข้อมูลในช่องว่างและเพิ่มรหัส ในกรณีนั้นวิธีการนั้นจะกลายเป็นการหลอกลวง หากไม่มีทางเลือกอื่นไม่แน่ใจว่าวิธีนี้สามารถแก้ไขได้อย่างสมบูรณ์แบบ
เทอร์โบ

เพิ่มคีย์ href ด้วย url ดั้งเดิมซึ่งให้ความสอดคล้องบนวัตถุส่งคืนนั้นพร้อมกับการนำ dom ไปใช้
mattdlockyer

2
หากใครบางคนจำเป็นต้องแยกวิเคราะห์ URL สัมพัทธ์นี่คือ regexp ที่อัปเดตแล้ว: / ^ (? :( https? \:) \ / \ /)? (([^: \ /? #] *) (?: \: ([0 -9] +))?) ([\ /] {0,1} [^? #] *) (\? [^ #] * |) (#. * |) $ /
shlensky

75
var loc = window.location;  // => "http://example.com:3000/pathname/?search=test#hash"

ส่งคืน currentUrl

หากคุณต้องการส่งสตริงเป็น url ( ไม่ทำงานใน IE11 ):

var loc = new URL("http://example.com:3000/pathname/?search=test#hash")

จากนั้นคุณสามารถแยกวิเคราะห์ได้เช่น:

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

คำตอบของ freddiefujiwara ค่อนข้างดี แต่ฉันก็ต้องสนับสนุน URL ที่เกี่ยวข้องภายใน Internet Explorer ฉันคิดวิธีแก้ปัญหาต่อไปนี้ขึ้นมา:

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

ตอนนี้ใช้เพื่อรับคุณสมบัติที่ต้องการ:

var a = getLocation('http://example.com/aa/bb/');
document.write(a.hostname);
document.write(a.pathname);

ตัวอย่าง JSFiddle: http://jsfiddle.net/6AEAB/


4
นี่ควรเป็นคำตอบที่ยอมรับได้ การใช้การจัดการ URL แบบสัมพัทธ์กับสัมบูรณ์อย่างชาญฉลาด +1
L0j1k

เห็นได้ชัดว่าไม่ใช่ครั้งแรกที่ลิงก์ JSFiddle เสียชีวิต: stackoverflow.com/questions/25179964/ …
ซานตาคลอส

3
สิ่งนี้ใช้งานได้ดี แต่ฉันมีหนึ่งการอัปเดตที่ฉันหวังว่าจะช่วยเหลือผู้อื่น ฉันใช้สิ่งนี้เพื่อตรวจสอบจุดเริ่มต้นของคำขอ postMessage และเมื่อพอร์ตเป็นพอร์ตเริ่มต้น (80 หรือ 443) จะไม่ได้ผนวกเข้ากับพา ธ ฉันตรวจสอบอย่างมีเงื่อนไขว่าเมื่อสร้าง URL ของฉัน: var locationHost = (location.port !== '80' && location.port !== '443') ? location.host : location.hostname; var locationOrigin = location.protocol + '//' + locationHost;
rhoster

2
ฉันได้แสดงความคิดเห็นนี้ในที่อื่น ๆ ในรุ่นที่ได้รับความนิยมมากขึ้นของโซลูชันนี้ แต่เนื่องจากนี่เป็นโซลูชันที่ฉันโปรดปรานฉันต้องการทำซ้ำที่นี่ ใน IE11 การมีชื่อผู้ใช้ใน href จะทำให้คุณสมบัติเหล่านี้ทั้งหมดอ่านเพื่อให้เกิดข้อผิดพลาดด้านความปลอดภัย ตัวอย่าง: " example.com " จะใช้ได้ดี แต่ " username@www.example.com " หรือ " ชื่อผู้ใช้: password@www.example.com " จะพยายามอ้างอิงคุณสมบัติอย่างใดอย่างหนึ่งขององค์ประกอบตัวยึด (ตัวอย่างเช่นแฮช) เพื่อล้มเหลวและเกิดข้อผิดพลาดที่น่าสะพรึงกลัว
Clippy

17

js-uri (มีอยู่ใน Google Code) ใช้ URL ของสตริงและแก้ไขวัตถุ URI จากมัน:

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

ขอบคุณ !!! แต่ฉันต้องการ uri = ตำแหน่งใหม่ (" example.com/aa/bb" ) typeof (window.location) == typeof (uri)
freddiefujiwara

เนื่องจาก window.location เป็นสตริงฉันไม่เห็นเลยว่ามันจะเป็นไปได้หรือมีประโยชน์ ทำไมประเภทต้องตรงกันเมื่อคุณสามารถแปลงจากประเภทหนึ่งเป็นอีกประเภทได้อย่างง่ายดาย?
Rex M

developer.mozilla.org/en/DOM/window.location API ที่ดีมาก !! ดังนั้นฉันจึงหวังว่าจะแปลง String เป็น window.location object
freddiefujiwara

1
การตั้งค่า window.location จะเปลี่ยนเบราว์เซอร์เพื่อไม่ให้เกิดขึ้น
epascarello

1
อืมใช่แล้ว window.location ไม่ใช่สตริง แต่สามารถกำหนดได้จากสตริง ฉันไม่แน่ใจว่าสามารถเลียนแบบได้หรือไม่ฉันลองกำหนดตำแหน่งต้นแบบให้กับวัตถุ uri ใหม่ แต่ไม่สามารถใช้งานได้
Rex M

12

สิ่งที่เกี่ยวกับการแสดงออกปกติง่าย ๆ

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แล้วคุณจะเห็นว่าเหตุใดการแสดงออกปกติธรรมดาไม่ได้ลดทอนลง ตอนนี้โยนสิ่งที่ไม่ถูกต้องลงไปและควรจะประกันตัวในวิธีที่คาดเดาได้เช่นกัน
Mikko Rantalainen

Simple regex สำหรับปัญหาง่าย ๆ :) แต่มันก็ไม่ฟังฉันเลยว่า url แบบนี้ไม่สามารถแยกวิเคราะห์ได้โดย regex มันแค่ต้องการปรับแต่งเพิ่มเติม แต่ฉันอาจจะไปห้องสมุดบางอย่างถ้าฉันต้องการบางสิ่งที่ซับซ้อนมากขึ้นและ bulletroof แม้ว่า
svestka

12

วันนี้ฉันพบปัญหานี้และพบ: URL - MDN Web APIs

var url = new URL("http://test.example.com/dir/subdir/file.html#hash");

ผลตอบแทนนี้:

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

หวังว่าการบริจาคครั้งแรกของฉันจะช่วยคุณ!


คำตอบซ้ำ
Martin van Driel

6
ใช่ แต่ผู้ชายที่อยู่ด้านบนเพิ่งอัพเดต awser ของเขาในปี 2560 ฉันโพสต์ในปี 2559
A. Moynet

อ่าฉันเสียใจด้วย
มาร์ตินแวนดริเกล

9

นี่คือรุ่นที่ฉันคัดลอกมาจากhttps://gist.github.com/1847816แต่เขียนใหม่ดังนั้นจึงง่ายต่อการอ่านและดีบัก วัตถุประสงค์ของการคัดลอกข้อมูลจุดยึดไปยังตัวแปรอื่นที่ชื่อว่า "ผลลัพธ์" เป็นเพราะข้อมูลจุดยึดยาวพอสมควรและการคัดลอกค่าจำนวน จำกัด ไปยังผลลัพธ์จะช่วยให้ผลลัพธ์ง่ายขึ้น

/**
 * 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

แยก URL ข้ามเบราว์เซอร์ทำงานรอบปัญหาทางญาติสำหรับ IE 6, 7, 8 และ 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;
}

การใช้งาน ( สาธิต JSFiddle ที่นี่ ):

var myUrl = new ParsedUrl("http://www.example.com:8080/path?query=123#fragment");

ผลลัพธ์:

{
    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

สำหรับผู้ที่กำลังมองหาโซลูชันที่ทันสมัยซึ่งใช้งานได้ใน IE, Firefox และ Chrome:

ไม่มีวิธีแก้ปัญหาเหล่านี้ที่ใช้องค์ประกอบเชื่อมโยงหลายมิติจะทำงานได้เหมือนกันในโครเมียม หากคุณส่ง URL ที่ไม่ถูกต้อง (หรือว่างเปล่า) ไปยังโครเมี่ยมจะส่งคืนโฮสต์ที่สคริปต์ถูกเรียกใช้ ดังนั้นใน IE คุณจะว่างเปล่าในขณะที่ Chrome คุณจะได้รับ localhost (หรืออะไรก็ตาม)

หากคุณพยายามที่จะดูผู้อ้างอิงนี่เป็นเรื่องหลอกลวง คุณจะต้องแน่ใจว่าโฮสต์ที่คุณได้รับนั้นอยู่ใน URL ดั้งเดิมเพื่อจัดการกับสิ่งนี้:

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

นี่เป็นสิ่งสำคัญที่ต้องพิจารณา!
2rs2ts

สิ่งนี้จะทำลาย URL ที่เกี่ยวข้องอย่างสมบูรณ์!
lakenen

4

วิธี AngularJS - ซอที่นี่: 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
มันจะเป็นมุมมากขึ้นถ้าคุณจะใช้$documentและ$windowบริการ
Cherniv

3

วิธีการแก้ปัญหาที่ง่ายและมีประสิทธิภาพโดยใช้รูปแบบโมดูล ซึ่งรวมถึงการแก้ไขสำหรับ IE ที่pathnameไม่ได้นำหน้าทับ ( /)

ฉันได้สร้างGistพร้อมกับJSFiddleซึ่งมีตัวแยกวิเคราะห์แบบไดนามิกมากขึ้น ฉันแนะนำให้คุณตรวจสอบและให้ข้อเสนอแนะ

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


3

ทำไมไม่ใช้มัน?

        $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

นอกจากนี้คุณยังสามารถใช้parse_url()ฟังก์ชันจากโครงการLocutus (php.js เดิม)

รหัส:

parse_url('http://username:password@hostname/path?arg=value#anchor');

ผลลัพธ์:

{
  scheme: 'http',
  host: 'hostname',
  user: 'username',
  pass: 'password',
  path: '/path',
  query: 'arg=value',
  fragment: 'anchor'
}

1
URL นั้นใช้งานไม่ได้สำหรับฉัน แต่ฉันพบว่าที่นี่github.com/hirak/phpjs/blob/master/functions/url/parse_url.js
Stan Quinn

@StanQuinn นั่นเป็นเพราะ php.js เปลี่ยนชื่อเป็น Locutus ฉันได้อัปเดตคำตอบของฉันด้วยลิงก์ใหม่
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");

ใช้งานได้ทั้ง URL แบบสัมบูรณ์และแบบสัมพัทธ์


abc://username:password@example.com:123/path/data?key=value&key2=value2#fragid1
山茶树和葡萄树

@ 山茶树和葡萄树ฉันได้อัปเดตรหัสเพื่อจัดการคอมโพเนนต์ย่อย userinfo อย่างถูกต้อง ขอบคุณสำหรับความคิดเห็นของคุณฉันไม่ได้สังเกตเห็นปัญหานั้นมาก่อน
Nikolay

รัก regex นี้
Kunal

2

หยุดการสร้างล้อใหม่ ใช้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
เพราะทุกครั้งที่คุณต้องการแก้ปัญหา ... ใช้ห้องสมุด? โอเค ... (ไม่ใช่)
jiminikiz

4
ไม่เสมอไป (จริง ๆ แล้วแทบจะไม่เคย) แต่ URL นั้นแยกวิเคราะห์ได้ยากมีรายละเอียดมากมายใน RFC ดีกว่าที่จะใช้ห้องสมุดที่มีการใช้งานและทดสอบโดยคนเป็นพัน
Hugo Sequeira

ลองใช้สิ่งที่มีอยู่ภายในแทนการให้คนอื่นพลิกโฉมวงล้อด้วยห้องสมุดได้ไหม ดูstackoverflow.com/a/24006120/747739
Phil

ไม่มีการรองรับ IE11 สำหรับฟังก์ชันในตัวดังนั้นไลบรารีนี้จึงยอดเยี่ยม การบอกว่าไม่เคยใช้ห้องสมุดเหมือนว่าเราไม่ควรใช้ jQuery และเพียงแค่เขียนโค้ดพื้นเมืองซึ่งไร้สาระอย่างแน่นอน นักพัฒนาซอฟต์แวร์ทุกคนมีกรณีการใช้งานที่แตกต่างกันไม่มีวิธีที่ 'ดีที่สุด' บางครั้งวานิลลา / ทำงานได้ดีที่สุดบางครั้งก็ไม่ได้ ... บางสิ่งบางอย่าง 92% ของนักพัฒนายังต้องเรียนรู้
tno2007


1

แฮ็คง่ายๆกับคำตอบแรก

var getLocation = function(href=window.location.href) {
    var l = document.createElement("a");
    l.href = href;
    return l;
};

สิ่งนี้สามารถใช้งานได้โดยไม่ต้องมีอาร์กิวเมนต์ที่จะคิดออกชื่อโฮสต์ปัจจุบัน getLocation () ชื่อโฮสต์จะให้ชื่อโฮสต์ปัจจุบัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.