From what I get, you don't want to use location
as the URL to subtract the port from, just any string as an URL. Well, I came up with this, for such a case. This function takes any string (but you can pass it the location
URL anyway, and it works the same):
function getPort(url) {
url = url.match(/^(([a-z]+:)?(\/\/)?[^\/]+).*$/)[1] || url;
var parts = url.split(':'),
port = parseInt(parts[parts.length - 1], 10);
if(parts[0] === 'http' && (isNaN(port) || parts.length < 3)) {
return 80;
}
if(parts[0] === 'https' && (isNaN(port) || parts.length < 3)) {
return 443;
}
if(parts.length === 1 || isNaN(port)) return 80;
return port;
}
- It gets the base url from the string.
- It splits the base url into parts, by
':'
.
- It tries to parse the digits-only part of the port (the last element of the
parts
array) into an integer.
- If the URL starts with
'http'
AND the port is not a number or the length of the URL parts array is less than 3 (which means no port was implied in the URL string), it returns the default HTTP port.
- Same thing goes for
'https'
.
- If the length was
1
, it means no protocol nor port was provided. In that case or in the case the port is not a number (and again, no protocol was provided), return the default HTTP
port.
- If it passes through all these tests, then it just returns the port it tried to parse into an integer at the beginning of the function.