यदि आप URL पार्स करना चाहते हैं, तो उपयोग करें java.net.URI। java.net.URLसमस्याओं का एक गुच्छा है - इसकी equalsविधि एक DNS लुकअप का उपयोग करती है जिसका अर्थ है कि कोड का उपयोग करते हुए यह अविश्वसनीय हमलों के साथ उपयोग किए जाने पर सेवा हमलों से इनकार करने के लिए असुरक्षित हो सकता है।
"मिस्टर गोसलिंग - आपने उर समान को चूसना क्यों बनाया?" ऐसी ही एक समस्या बताते हैं। बस java.net.URIइसके बजाय उपयोग करने की आदत डालें।
public static String getDomainName(String url) throws URISyntaxException {
URI uri = new URI(url);
String domain = uri.getHost();
return domain.startsWith("www.") ? domain.substring(4) : domain;
}
आपको जो चाहिए वो करना चाहिए।
हालांकि यह ठीक काम करने के लिए लगता है, क्या कोई बेहतर दृष्टिकोण है या कुछ किनारे मामले हैं, जो विफल हो सकते हैं।
मान्य URL के लिए आपका कोड विफल रहता है:
httpfoo/bar- एक पथ घटक के साथ सापेक्ष URL जो इसके साथ शुरू होता है http।
HTTP://example.com/ - प्रोटोकॉल केस-असंवेदनशील है।
//example.com/ - होस्ट के साथ प्रोटोकॉल सापेक्ष URL
www/foo - एक पथ के घटक के साथ एक रिश्तेदार URL जो इसके साथ शुरू होता है www
wwwexample.com- डोमेन नाम जो शुरू नहीं होता है, www.लेकिन इसके साथ शुरू होता है www।
पदानुक्रमित URL में एक जटिल व्याकरण होता है। यदि आप RFC 3986 को ध्यान से पढ़े बिना अपने स्वयं के पार्सर को रोल करने का प्रयास करते हैं, तो आप शायद इसे गलत समझेंगे। बस उसी का उपयोग करें जो मुख्य पुस्तकालयों में बनाया गया है।
यदि आपको वास्तव में गन्दे इनपुट से निपटने की आवश्यकता है java.net.URI, जो RFC 3986 परिशिष्ट B को अस्वीकार करता है :
परिशिष्ट बी। एक नियमित अभिव्यक्ति के साथ एक यूआरआई संदर्भ पार्सिंग
जैसा कि "प्रथम-मैच-जीत" एल्गोरिथ्म POSIX नियमित अभिव्यक्ति द्वारा उपयोग किए जाने वाले "लालची" असंतुलन विधि के समान है, एक यूआरआई संदर्भ के संभावित पांच घटकों को पार्स करने के लिए एक नियमित अभिव्यक्ति का उपयोग करना स्वाभाविक और सामान्य है।
निम्नलिखित घटकों को अपने घटकों में एक अच्छी तरह से गठित यूआरआई संदर्भ को तोड़ने के लिए नियमित अभिव्यक्ति है।
^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
12 3 4 5 6 7 8 9
ऊपर की दूसरी पंक्ति में संख्या केवल पठनीयता की सहायता के लिए है; वे प्रत्येक उपसंचाई (यानी, प्रत्येक युग्मित कोष्ठक) के लिए संदर्भ बिंदुओं को इंगित करते हैं।
http://74.125.226.70और मुझे बताएं कि यह कैसे काम करता है :)