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.isEmpty ||
str.length > 2083 ||
str.startsWith('mailto:')) {
return false;
}
String protocol;
String user;
String auth;
String host;
String hostname;
int port;
String portStr;
String path;
String query;
String hash;
List<String> split;
// check protocol
split = str.split('://');
if (split.length > 1) {
protocol = shift(split);
if (!protocols.contains(protocol)) {
return false;
}
} else if (requireProtocol == true) {
return false;
}
str = split.join('://');
// check hash
split = str.split('#');
str = shift(split);
hash = split.join('#');
if (hash != '' && RegExp(r'\s').hasMatch(hash)) {
return false;
}
// check query params
split = str.split('?');
str = shift(split);
query = split.join('?');
if (query != '' && RegExp(r'\s').hasMatch(query)) {
return false;
}
// check path
split = str.split('/');
str = shift(split);
path = split.join('/');
if (path != '' && RegExp(r'\s').hasMatch(path)) {
return false;
}
// check auth type urls
split = str.split('@');
if (split.length > 1) {
auth = shift(split);
if (auth.contains(':')) {
final authParts = auth.split(':');
user = shift(authParts);
if (!RegExp(r'^\S+$').hasMatch(user)) {
return false;
}
if (!RegExp(r'^\S*$').hasMatch(user)) {
return false;
}
}
}
// check hostname
hostname = split.join('@');
split = hostname.split(':');
host = shift(split);
if (split.isNotEmpty) {
portStr = split.join(':');
try {
port = int.parse(portStr, radix: 10);
} on FormatException {
return false;
}
if (!RegExp(r'^[0-9]+$').hasMatch(portStr) || 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;
}