isURL function
check if the string str
is a URL
protocols
sets the list of allowed protocolsrequireTld
sets if TLD is requiredrequireProtocol
is abool
that sets if protocol is required for validationallowUnderscore
sets if underscores are allowedhostWhitelist
sets the list of allowed hostshostBlacklist
sets 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;
}