isURL function
check if the string is a URL
options
is a Map
which defaults to
{ 'protocols': ['http','https','ftp'], 'require_tld': true, 'require_protocol': false, 'allow_underscores': false }
.
Implementation
bool isURL(String str, [Map<String, Object>? options]) {
if (str.isEmpty || str.length > 2083 || str.indexOf('mailto:') == 0) {
return false;
}
final default_url_options = {
'protocols': ['http', 'https', 'ftp'],
'require_tld': true,
'require_protocol': false,
'allow_underscores': false,
};
options = merge(options, default_url_options);
var protocol,
user,
pass,
auth,
host,
hostname,
port,
port_str,
path,
query,
hash,
split;
// check protocol
split = str.split('://');
if (split.length > 1) {
protocol = shift(split);
final protocols = options['protocols'] as List<String>;
if (protocols.indexOf(protocol) == -1) {
return false;
}
} else if (options['require_protocol'] == true) {
return false;
}
str = split.join('://');
// check hash
split = str.split('#');
str = shift(split);
hash = split.join('#');
if (hash != null && hash != "" && RegExp(r'\s').hasMatch(hash)) {
return false;
}
// check query params
split = str.split('?');
str = shift(split);
query = split.join('?');
if (query != null && query != "" && RegExp(r'\s').hasMatch(query)) {
return false;
}
// check path
split = str.split('/');
str = shift(split);
path = split.join('/');
if (path != null && path != "" && RegExp(r'\s').hasMatch(path)) {
return false;
}
// check auth type urls
split = str.split('@');
if (split.length > 1) {
auth = shift(split);
if (auth.indexOf(':') >= 0) {
auth = auth.split(':');
user = shift(auth);
if (!RegExp(r'^\S+$').hasMatch(user)) {
return false;
}
pass = auth.join(':');
if (!RegExp(r'^\S*$').hasMatch(pass)) {
return false;
}
}
}
// check hostname
hostname = split.join('@');
split = hostname.split(':');
host = shift(split);
if (split.length > 0) {
port_str = split.join(':');
try {
port = int.parse(port_str, radix: 10);
} catch (e) {
return false;
}
if (!RegExp(r'^[0-9]+$').hasMatch(port_str) || port <= 0 || port > 65535) {
return false;
}
}
if (!isIP(host) && !isFQDN(host, options) && host != 'localhost') {
return false;
}
return true;
}