isURL function
check if the string str is a URL
protocolssets the list of allowed protocolsrequireTldsets if TLD is requiredrequireProtocolis aboolthat sets if protocol is required for validationallowUnderscoresets if underscores are allowedhostWhitelistsets the list of allowed hostshostBlacklistsets the list of disallowed hosts
Implementation
bool isURL(String? str,
{List<String?> protocols = const ['http', 'https', 'ftp'],
bool requireTld = true,
bool requireProtocol = false,
bool allowUnderscore = false,
List<String> hostWhitelist = const [],
List<String> hostBlacklist = const []}) {
if (str == null ||
str.length == 0 ||
str.length > 2083 ||
str.startsWith('mailto:')) {
return false;
}
var protocol,
user,
auth,
host,
hostname,
port,
port_str,
path,
query,
hash,
split;
// check protocol
split = str.split('://');
if (split.length > 1) {
protocol = shift(split);
if (protocols.indexOf(protocol) == -1) {
return false;
}
} else if (requireProtocol == true) {
return false;
}
str = split.join('://');
// check hash
split = str!.split('#');
str = shift(split);
hash = split.join('#');
if (hash != null && hash != "" && new RegExp(r'\s').hasMatch(hash)) {
return false;
}
// check query params
split = str!.split('?');
str = shift(split);
query = split.join('?');
if (query != null && query != "" && new RegExp(r'\s').hasMatch(query)) {
return false;
}
// check path
split = str!.split('/');
str = shift(split);
path = split.join('/');
if (path != null && path != "" && new 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 (!new RegExp(r'^\S+$').hasMatch(user)) {
return false;
}
if (!new RegExp(r'^\S*$').hasMatch(user)) {
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 (!new RegExp(r'^[0-9]+$').hasMatch(port_str) ||
port <= 0 ||
port > 65535) {
return false;
}
}
if (!isIP(host) &&
!isFQDN(host,
requireTld: requireTld, allowUnderscores: allowUnderscore) &&
host != 'localhost') {
return false;
}
if (hostWhitelist.isNotEmpty && !hostWhitelist.contains(host)) {
return false;
}
if (hostBlacklist.isNotEmpty && hostBlacklist.contains(host)) {
return false;
}
return true;
}