function explodeUri(str) {
let regexUri = /^([a-z][a-z0-9+.-]*):(?:\/\/((?:(?=((?:[a-z0-9-._~!$&'()*+,;=:]|%[0-9A-F]{2})*))(\3)@)?(?=(\[[0-9A-F:.]{2,}\]|(?:[a-z0-9-._~!$&'()*+,;=]|%[0-9A-F]{2})*))\5(?::(?=(\d*))\6)?)(\/(?=((?:[a-z0-9-._~!$&'()*+,;=:@\/]|%[0-9A-F]{2})*))\8)?|(\/?(?!\/)(?=((?:[a-z0-9-._~!$&'()*+,;=:@\/]|%[0-9A-F]{2})*))\10)?)(?:\?(?=((?:[a-z0-9-._~!$&'()*+,;=:@\/?]|%[0-9A-F]{2})*))\11)?(?:#(?=((?:[a-z0-9-._~!$&'()*+,;=:@\/?]|%[0-9A-F]{2})*))\12)?$/i;
let match = str.match(regexUri);
if (!match) {
throw new Error('Invalid URI');
}
return {
scheme: match[1],
userinfo: match[4],
host: match[5],
port: match[6],
path: match[7] || match[9],
query: match[11],
fragment: match[12]
};
}
function testUriValidation() {
const validUrls = [
'https://www.example.com/path/to/resource?query=value#fragment',
'ftp://username:password@ftp.example.com:21/path/to/file',
'http://subdomain.example.co.uk/page?param=value',
'mailto:user@example.com',
'tel:+123456789',
'file:///path/to/file.txt',
'data:text/plain;base64,SGVsbG8sIFdvcmxkIQ%3D%3D',
'https://[2001:db8::1]/path',
'https://user@192.168.0.1',
'http://user:pass@[::1]:8080/path',
'http://example.com/a%20b',
'https://example.com/%E2%82%AC100',
'http://example.com?name=John%20Doe',
'https://example.com#section-3.4',
'https://example.com:8080',
'https://example.com:8080/path?query=value',
];
const invalidUrls = [
'invalid-url',
'http://www.example.com:8080:',
'ftp://user:pass@invalid host/',
'http://[::1]',
'https://user@192.168.0.1:invalid',
'http://example.com/ path with space',
"https://example.com?invalid=query",
'ftp://example.com:8080#invalid-fragment',
"http://example.com:8080/path?query#fragment",
"http://:8080/path",
'ftp://user@:21/path',
'http://example.com/path?query#fragment%zz',
'schema://user:pass@server.db.schema.table:1234?option=value#rowid'
];
const uri = 'https://username:password@www.example.com:8080/path/to/resource?query=value#fragment';
const explodedUri = explodeUri(uri);
console.log(explodedUri);
console.log('Valid URLs:');
validUrls.forEach((url) => {
console.log("validationg: ", url)
try {
const explodedUri = explodeUri(url);
console.log('O:', url, explodedUri);
} catch (error) {
console.log('X', url, 'Error:', error.message);
}
});
console.log('\nInvalid URLs:');
invalidUrls.forEach((url) => {
try {
const explodedUri = explodeUri(url);
console.log('X:', url, 'Exploded URI:', explodedUri);
} catch (error) {
console.log('ERROR: ', url, error.message);
}
});
}
testUriValidation();