An alternative way to parse URL in JavaScript

Summary

Developers often parse URLs using the `location` object, but an alternative method involves leveraging the browser's DOM capabilities. This approach creates an `` element, assigns the URL to its `href` property, and then accesses the element's built-in URL parsing properties like `protocol`, `hostname`, and `port`. A provided JavaScript function, `parseURL`, encapsulates this technique to return a comprehensive object containing various URL components. This includes not only standard properties but also parsed query parameters, file name, hash, path segments, and the full source URL. This method offers a robust way to extract detailed information from any given URL string.

Normally when we need to process URL in JavaScript, we may use the location object. Then we can use location.hostname,location.href,location.port etc to get the information we need. In this post, we will parse an URL with an alternative way.

We can use an URL to create a DOM object by calling document.createElement("a"). The complete code is:

function parseURL(url) {
	var a = document.createElement('a');
	a.href = url;
	return {
		source: url,
		protocol: a.protocol.replace(':',''),
		host: a.hostname,
		port: a.port,
		query: a.search,
		params: (function(){
			var ret = {},
			seg = a.search.replace(/^\?/,'').split('&'),
			len = seg.length, i = 0, s;
			for (;i<len;i++) {
				if (!seg[i]) { continue; }
				s = seg[i].split('=');
				ret[s[0]] = s[1];
			}
			return ret;
		})(),
		file: (a.pathname.match(/\/([^\/?#]+)$/i) || [,''])[1],
		hash: a.hash.replace('#',''),
		path: a.pathname.replace(/^([^\/])/,'/$1'),
		relative: (a.href.match(/tps?:\/\/[^\/]+(.+)/) || [,''])[1],
		segments: a.pathname.replace(/^\//,'').split('/')
	};
}

The usage of this method is:

var myURL = parseURL('http://abc.com:8080/dir/index.html?id=255&m=hello#top');
myURL.file; // = 'index.html'
myURL.hash; // = 'top'
myURL.host; // = 'abc.com'
myURL.query; // = '?id=255&m=hello'
myURL.params; // = Object = { id: 255, m: hello }
myURL.path; // = '/dir/index.html'
myURL.segments; // = Array = ['dir', 'index.html']
myURL.port; // = '8080'
myURL.protocol; // = 'http'
myURL.source; // = 'http://abc.com:8080/dir/index.html?id=255&m=hello#top'

Source : http://bbs.html5cn.org/thread-436-1-25.html

URL LOCATION PARSE

  RELATED

  COMMENT

1
Florencia
Apr 3, 2014 at 7:32 am
Hey very interesting blog!