मैं एक स्ट्रिंग लेना चाहूंगा
var a = "http://example.com/aa/bb/"
और इसे एक ऐसी वस्तु में संसाधित करें
a.hostname == "example.com"
तथा
a.pathname == "/aa/bb"
मैं एक स्ट्रिंग लेना चाहूंगा
var a = "http://example.com/aa/bb/"
और इसे एक ऐसी वस्तु में संसाधित करें
a.hostname == "example.com"
तथा
a.pathname == "/aa/bb"
जवाबों:
आधुनिक तरीका:
new URL("http://example.com/aa/bb/")
गुणों के साथ एक वस्तु लौटाता है hostname
और कुछ अन्य लोगोंpathname
के साथ ।
पहला तर्क एक रिश्तेदार या पूर्ण URL है; यदि यह सापेक्ष है, तो आपको दूसरा तर्क (आधार URL) निर्दिष्ट करने की आवश्यकता है। उदाहरण के लिए, वर्तमान पृष्ठ के सापेक्ष URL के लिए:
new URL("/aa/bb/", location)
ब्राउज़रों के अलावा, यह एपीआई v7 के माध्यम से Node.js में भी उपलब्ध है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
प्रमुख स्लेश को हटा देता है, जबकि अन्य ब्राउज़र नहीं करते हैं। तो आप अपने ब्राउज़र पर निर्भर करते हुए /path
या के साथ समाप्त करेंगे path
।
यहाँ पाया गया: 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;
और निम्नलिखित सभी लाइनें काम करती हैं। इसे अभी क्रोम और IE9 में आज़माया।
pathname
IE में अग्रणी स्लैश शामिल नहीं है। जाओ पता लगाओ। : डी
http:
तब भी लौटेगा जब आप सिर्फ domain.com
href (बिना किसी प्रोटोकॉल के) पास होंगे। यदि प्रोटोकॉल गायब था, और यदि मैं इसे जोड़ सकता हूं, तो यह जांचने के लिए मैं इसका उपयोग करना चाहता था, लेकिन यह http मानता है: इसलिए इस उद्देश्य के लिए इसका उपयोग करने में असमर्थ था।
a
टैग व्यवहार का अनुकरण करने वाले 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);
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"
freddiefujiwara का जवाब बहुत अच्छा है, लेकिन मुझे इंटरनेट एक्सप्लोरर के भीतर रिश्तेदार URL का समर्थन करने की भी आवश्यकता है। मैं निम्नलिखित समाधान के साथ आया:
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/
var locationHost = (location.port !== '80' && location.port !== '443') ? location.host : location.hostname;
var locationOrigin = location.protocol + '//' + locationHost;
js-uri (Google कोड पर उपलब्ध) एक स्ट्रिंग 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
सरल नियमित अभिव्यक्ति के बारे में क्या?
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
और आप देखेंगे कि सरल नियमित अभिव्यक्ति इसे काटती क्यों नहीं है। अब इसे कुछ अवैध रूप से फेंक दें और इसे पूर्वानुमेय तरीके से भी जमानत देनी चाहिए।
आज मैं इस समस्या को पूरा करता हूं और मैंने पाया: URL - MDN वेब एपीआई
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: "" }
मेरे पहले योगदान की आशा करना आपकी सहायता करता है!
यहाँ एक संस्करण है जिसे मैंने 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;
}
क्रॉस-ब्राउज़र 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"
}
IE, फ़ायरफ़ॉक्स और क्रोम में काम करने वाले आधुनिक समाधान की तलाश करने वालों के लिए:
हाइपरलिंक तत्व का उपयोग करने वाला इनमें से कोई भी समाधान क्रोम में समान काम नहीं करेगा।यदि आप किसी अमान्य (या रिक्त) URL को क्रोम में पास करते हैं, तो यह हमेशा उस होस्ट को लौटा देगा जहां से स्क्रिप्ट को कॉल किया जाता है। तो IE में आपको खाली मिलेगा, जबकि क्रोम में आपको लोकलहोस्ट (या जो भी) मिलेगा।
यदि आप रेफरल को देखने की कोशिश कर रहे हैं, तो यह धोखा है। आप यह सुनिश्चित करना चाहेंगे कि जो होस्ट आपको वापस मिले, वह इससे निपटने के लिए मूल 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 : '';
}
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>
$document
और $window
सेवाओं का उपयोग करेंगे तो यह अधिक कोणीय होगा
मॉड्यूल पैटर्न का उपयोग करके सरल और मजबूत समाधान। इसमें IE के लिए एक फिक्स शामिल है जहां pathname
हमेशा एक अग्रणी फ़ॉरवर्ड-स्लैश नहीं होता है (/
) नहीं होता है।
मैं एक बनाया है सार एक साथ 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"
}
का प्रयोग करें https://www.npmjs.com/package/uri-parse-lib इस के लिए
var t = parserURI("http://user:pass@example.com:8080/directory/file.ext?query=1&next=4&sed=5#anchor");
इसका उपयोग क्यों नहीं करते?
$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 ) );
तुम भी उपयोग कर सकते हैं 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'
}
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");
यह निरपेक्ष और सापेक्ष दोनों तरह के काम करता है
abc://username:password@example.com:123/path/data?key=value&key2=value2#fragid1
पहिए को फिर से लगाना बंद करें। 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");
बस url.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...
hostname
औरpathname
सीधे पहुँच सकते हैंlocation
।