You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
856 B
47 lines
856 B
|
|
/** |
|
* Expose `isUrl`. |
|
*/ |
|
|
|
module.exports = isUrl; |
|
|
|
/** |
|
* RegExps. |
|
* A URL must match #1 and then at least one of #2/#3. |
|
* Use two levels of REs to avoid REDOS. |
|
*/ |
|
|
|
var protocolAndDomainRE = /^(?:\w+:)?\/\/(\S+)$/; |
|
|
|
var localhostDomainRE = /^localhost[\:?\d]*(?:[^\:?\d]\S*)?$/ |
|
var nonLocalhostDomainRE = /^[^\s\.]+\.\S{2,}$/; |
|
|
|
/** |
|
* Loosely validate a URL `string`. |
|
* |
|
* @param {String} string |
|
* @return {Boolean} |
|
*/ |
|
|
|
function isUrl(string){ |
|
if (typeof string !== 'string') { |
|
return false; |
|
} |
|
|
|
var match = string.match(protocolAndDomainRE); |
|
if (!match) { |
|
return false; |
|
} |
|
|
|
var everythingAfterProtocol = match[1]; |
|
if (!everythingAfterProtocol) { |
|
return false; |
|
} |
|
|
|
if (localhostDomainRE.test(everythingAfterProtocol) || |
|
nonLocalhostDomainRE.test(everythingAfterProtocol)) { |
|
return true; |
|
} |
|
|
|
return false; |
|
}
|
|
|