जावा में वैध URL की जाँच कैसे करें?


92

यदि URL जावा में मान्य है, तो जांचने का सबसे अच्छा तरीका क्या है?

यदि कॉल करने new URL(urlString)और पकड़ने की कोशिश की जाती है MalformedURLException, लेकिन ऐसा लगता है कि जो कुछ भी शुरू होता है, उससे खुश होता है http://

मुझे संबंध स्थापित करने की चिंता नहीं है, बस वैधता है। क्या इसके लिए कोई विधि है? हाइबरनेट वैलिडेटर में एक एनोटेशन? क्या मुझे रेगेक्स का उपयोग करना चाहिए?

संपादित करें: स्वीकार कर लिया यूआरएल के कुछ उदाहरण हैं http://***और http://my favorite site!


यदि आप कनेक्शन स्थापित नहीं करने जा रहे हैं तो आप वैधता को कैसे परिभाषित करते हैं?
माइकल मायर्स

2
क्या आप किसी ऐसी चीज़ का उदाहरण दे सकते हैं जो वैध URL नहीं है जिसे URLकंस्ट्रक्टर स्वीकार करता है?
कोयलमैन

1
@ खरीदार: वैधता को RFC द्वारा निर्धारित किया जाना चाहिए 2396 और 2732, जो परिभाषित करते हैं कि URL क्या है।
कोयलमैन

4
@ ऑकमैन: बस किसी भी चीज के बारे में। " http://***" काम करता है। " http://my favorite site!" काम करता है। मैं इसे अपवाद फेंकने के लिए नहीं पा सकता (जब http: // शुरुआत में है।)
एरिक विल्सन

जवाबों:


100

Apache Commons UrlValidator वर्ग का उपयोग करने पर विचार करें

UrlValidator urlValidator = new UrlValidator();
urlValidator.isValid("http://my favorite site!");

कई गुण हैं जो आप यह नियंत्रित करने के लिए सेट कर सकते हैं कि यह वर्ग कैसे व्यवहार करता है, डिफ़ॉल्ट रूप httpसे https, और ftpस्वीकार किया जाता है।


7
यह नए डोमेन जैसे .london आदि के साथ काम नहीं करता है
VH

इंट्रानेट के बारे में कैसे?
पुनीत

यह अंडरस्कोर के साथ यूआरएल को मान्य नहीं करता है।
उदित कुमावत

नए TLD और स्थानीय डोमेन नाम, जैसे local, आदि के साथ काम नहीं करता है

मुझे हमारे अजीब इंट्रानेट शीर्ष स्तर डोमेन के साथ काम करने के लिए UrlValidator नहीं मिल सका। आम लोग जैसे .com, .org, और इस तरह के काम करते हैं। मैं इस मामले के लिए एक RegExp बनाने में दिलचस्पी नहीं रखता हूं इसलिए new URL(name).toURI()समाधान बन गया।
Avec

59

यहाँ तरीका है जो मैंने कोशिश की और उपयोगी पाया,

URL u = new URL(name); // this would check for the protocol
u.toURI(); // does the extra checking required for validation of URI 

1
अच्छा था। केवल नए URL (नाम) का उपयोग करना लगभग सब कुछ स्वीकार करता है। Url.toURI (); क्या वास्तव में डेवलपर अन्य पुस्तकालयों / चौखटे का उपयोग किए बिना देख रहा है!
justastefan

2
यह विकृत URL जैसे http: /google.com के लिए भी काम नहीं करेगा। मैंने Apache Commons से UrlValidator का उपयोग किया।
14:02 बजे स्टारफ

1
यह वास्तव में खतरनाक है। मैं देखता हूं कि इस उदाहरण के साथ बहुत सारे अन्य लेख हैं। URL u = new URL(http://google).toURI();एक अपवाद नहीं फेंकेंगे।
सोनू ओमन

@SonuOommen शायद इसलिए new URL(http://google)मान्य है ^ ^ हमारे पास इस तरह से मेरी कंपनी में बहुत सारे आंतरिक डोमेन हैं
user43968

8

मुझे यह सचाई मावुशे के जवाब के लिए एक टिप्पणी के रूप में पोस्ट करना अच्छा लगेगा , लेकिन मुझे डर है कि पर्याप्त जगह नहीं है;)

यह Apache Commons UrlValidator स्रोत से प्रासंगिक हिस्सा है :

/**
 * This expression derived/taken from the BNF for URI (RFC2396).
 */
private static final String URL_PATTERN =
        "/^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?/";
//         12            3  4          5       6   7        8 9

/**
 * Schema/Protocol (ie. http:, ftp:, file:, etc).
 */
private static final int PARSE_URL_SCHEME = 2;

/**
 * Includes hostname/ip and port number.
 */
private static final int PARSE_URL_AUTHORITY = 4;

private static final int PARSE_URL_PATH = 5;

private static final int PARSE_URL_QUERY = 7;

private static final int PARSE_URL_FRAGMENT = 9;

आप आसानी से वहाँ से अपना सत्यापनकर्ता बना सकते हैं।


6

URL की उपलब्धता की जांच करने के लिए सबसे "मूर्ख" तरीका है:

public boolean isURL(String url) {
  try {
     (new java.net.URL(url)).openStream().close();
     return true;
  } catch (Exception ex) { }
  return false;
}

4

बाहरी पुस्तकालयों के बिना मेरा पसंदीदा दृष्टिकोण:

try {
    URI uri = new URI(name);

    // perform checks for scheme, authority, host, etc., based on your requirements

    if ("mailto".equals(uri.getScheme()) {/*Code*/}
    if (uri.getHost() == null) {/*Code*/}

} catch (URISyntaxException e) {
}

3

के लिए स्रोत कोड को देखते हुए URI,

public URL(URL context, String spec, URLStreamHandler handler)

कंस्ट्रक्टर अन्य कंस्ट्रक्टरों की तुलना में अधिक सत्यापन करता है। आप कोशिश कर सकते हैं कि एक, लेकिन YMMV।


3

मुझे कोई भी कार्यान्वयन पसंद नहीं आया (क्योंकि वे एक Regex का उपयोग करते हैं जो एक महंगा ऑपरेशन है, या एक पुस्तकालय जो एक ओवरकिल है यदि आपको केवल एक विधि की आवश्यकता है), तो मैंने कुछ के साथ java.net.URI वर्ग का उपयोग करके समाप्त किया अतिरिक्त चेक, और प्रोटोकॉल को सीमित करने के लिए: http, https, file, ftp, mailto, news, urn।

और हां, अपवादों को पकड़ना एक महंगा ऑपरेशन हो सकता है, लेकिन शायद रेगुलर एक्सप्रेशंस जितना बुरा नहीं है:

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;
}

2

सत्यापनकर्ता पैकेज:

लगता है कि यूलतन मैटलन द्वारा एक अच्छा पैकेज उरुलेट कहा जाता है । इसके एपीआई का हवाला देते हुए:

isValidWebPageAddress(java.lang.String address, boolean validateSyntax, 
                      boolean validateExistance) 
Checks if the given address is a valid web page address.

सूर्य का दृष्टिकोण - नेटवर्क पते की जांच करें

सन की जावा साइट समाधान के रूप में कनेक्ट प्रयास प्रदान करती है यूआरएल को मान्य करती है।

अन्य रेगेक्स कोड स्निपेट:

वहाँ कम से regex मान्यता प्रयास कर रहे हैं Oracle की साइट और weberdev.com


1
यह कोड लिंक की जाँच के लिए है, जो एक अलग समस्या है। यह प्रश्न URL की वैधता के बारे में है, न कि यह कि क्या कोई कनेक्शन स्थापित किया जा सकता है।
माइकल मायर्स

यह उदाहरण यह जाँचने के बारे में है कि क्या URL उपलब्ध है, न कि यह अच्छी तरह से बनाया गया है।
कोयलमैन

सहमत हुए, अन्य दृष्टिकोण जोड़े।
एडम मटन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.