আমি কোনও বাস্তবায়ন পছন্দ করি না (কারণ তারা একটি রেজিেক্স ব্যবহার করে যা একটি ব্যয়বহুল অপারেশন, বা একটি লাইব্রেরি যা ওভারকিল যা আপনার যদি কেবল একটি পদ্ধতির প্রয়োজন হয়), তাই আমি জাভা.net. ইউআরআই ক্লাসটি কিছু দিয়ে শেষ করেছি অতিরিক্ত চেক এবং প্রোটোকলগুলিতে সীমাবদ্ধ করে: HTTP, https, ফাইল, এফটিপি, মেলটো, সংবাদ, কল।
এবং হ্যাঁ, ব্যতিক্রম ধরা ব্যয়বহুল ক্রিয়াকলাপ হতে পারে তবে নিয়মিত এক্সপ্রেশনগুলির মতো সম্ভবত খারাপ নয়:
final static Set<String> protocols, protocolsWithHost;
static {
protocolsWithHost = new HashSet<String>(
Arrays.asList( new String[]{ "file", "ftp", "http", "https" } )
);
protocols = new HashSet<String>(
Arrays.asList( new String[]{ "mailto", "news", "urn" } )
);
protocols.addAll(protocolsWithHost);
}
public static boolean isURI(String str) {
int colon = str.indexOf(':');
if (colon < 3) return false;
String proto = str.substring(0, colon).toLowerCase();
if (!protocols.contains(proto)) return false;
try {
URI uri = new URI(str);
if (protocolsWithHost.contains(proto)) {
if (uri.getHost() == null) return false;
String path = uri.getPath();
if (path != null) {
for (int i=path.length()-1; i >= 0; i--) {
if ("?<>:*|\"".indexOf( path.charAt(i) ) > -1)
return false;
}
}
}
return true;
} catch ( Exception ex ) {}
return false;
}