कैसे जांचें कि एक उड़ी स्ट्रिंग वैध है


82

आप कैसे जांचते हैं कि एक उड़ी स्ट्रिंग वैध है (कि आप इसे उरी कंस्ट्रक्टर को खिला सकते हैं)?

अब तक मेरे पास केवल निम्नलिखित हैं, लेकिन स्पष्ट कारणों से मैं कम क्रूर तरीका पसंद करूंगा:

    Boolean IsValidUri(String uri)
    {
        try
        {
            new Uri(uri);
            return true;
        }
        catch
        {
            return false;
        }
    }

मैंने Uri.IsWellFormedUriString की कोशिश की, लेकिन यह सब कुछ पसंद नहीं है जिसे आप कंस्ट्रक्टर पर फेंक सकते हैं। उदाहरण के लिए:

String test = @"C:\File.txt";
Console.WriteLine("Uri.IsWellFormedUriString says: {0}", Uri.IsWellFormedUriString(test, UriKind.RelativeOrAbsolute));
Console.WriteLine("IsValidUri says: {0}", IsValidUri(test));

उत्पादन होगा:

Uri.IsWellFormedUriString says: False
IsValidUri says: True

अपडेट / जवाब

Uri कंस्ट्रक्टर डिफ़ॉल्ट रूप से पूर्ण निरपेक्ष का उपयोग करता है। यह एक विसंगति पैदा कर रहा था जब मैंने Uri.TryCreate और कंस्ट्रक्टर का उपयोग करने की कोशिश की। यदि आप निर्माणकर्ता और TryCreate दोनों के लिए UriKind से मेल खाते हैं, तो आपको अपेक्षित परिणाम मिलता है।

जवाबों:


82

एक अच्छी तरह से गठित URI का अर्थ है कि कुछ RFC के साथ अनुरूपता। आपके उदाहरण में स्थानीय पथ इन के अनुरूप नहीं है। IsWellFormedUriStringप्रलेखन में अधिक पढ़ें ।

उस पद्धति से एक गलत परिणाम का अर्थ यह नहीं है कि Uriवर्ग इनपुट पार्स नहीं कर पाएगा। हालांकि URI इनपुट RFC अनुरूप नहीं हो सकता है, फिर भी यह एक मान्य URI हो सकता है।

अपडेट : और आपके प्रश्न का उत्तर देने के लिए - जैसा कि उरी दस्तावेज़ीकरण दिखाता है, एक स्थैतिक विधि है जिसे कहा जाता है TryCreateकि आप जो चाहते हैं वह सही और गलत या (और वास्तविक Uriउदाहरण यदि सही हो) वापस करने का प्रयास करेगा ।


सवाल यह है कि "आप कैसे जांचते हैं कि एक उड़ी स्ट्रिंग वैध है (कि आप इसे उरी कंस्ट्रक्टर को खिला सकते हैं)?"
मैनुअल

1
TryCreate वास्तव में आपको यह नहीं बताता है कि क्या एक स्ट्रिंग को कंस्ट्रक्टर द्वारा स्वीकार किया जाएगा। अपडेट देखें
मैनुअल

@ मैनुअल: जो बिल्कुल भी समझ में नहीं आता है - TryCreateऔर Uriनिर्माता का परिणाम समान होना चाहिए - UriKindजैसे आपने के लिए किया था पारित करने का प्रयास करें TryCreate
BrokenGlass

1
आप सही हे। निर्माता डिफ़ॉल्ट तरह का निरपेक्ष उपयोग करता है। धन्यवाद।
मैनुअल

3
.Net स्रोतों के अनुसार , IsWellFormedUriString विधि में TryCreate पद्धति कॉल प्लस चेक शामिल हैं , इसलिए मैं ऐसे कार्यों के लिए अधिक शक्तिशाली के रूप में IsWellFormedUriString विधि का उपयोग करना पसंद करता हूं।
इगोर कुस्तोव

43

चूंकि स्वीकृत उत्तर एक स्पष्ट उदाहरण प्रदान नहीं करता है, यहाँ URI को C # में मान्य करने के लिए कुछ कोड है:

Uri outUri;

if (Uri.TryCreate("ThisIsAnInvalidAbsoluteURI", UriKind.Absolute, out outUri)
   && (outUri.Scheme == Uri.UriSchemeHttp || outUri.Scheme == Uri.UriSchemeHttps))
{
    //Do something with your validated Absolute URI...
}

2
Uri.TryCreate फ़ंक्शन पर भरोसा न करें! यह खराब URL की भी अनुमति देगा। यह 'http: // http: // google.com/page' (रिक्त स्थान निकालें) आज़माएँ। यह URL TryCreate फ़ंक्शन को पास करता है, लेकिन यह गलत है।
No1Lives4Ever

5
@ No1Lives4Ever आप सही हैं कि आपने जो उल्लेख किया है, वह वैध है, लेकिन यह तकनीकी रूप से गलत नहीं है। अंग्रेजी में व्याख्या: http प्रोटोकॉल ( http: // ) का उपयोग करते हुए , "http" (http: // ** http **) के लिए DNS प्रविष्टि को एक स्पष्ट (लेकिन छोड़े गए) पोर्ट ( http **: * का उपयोग करके कनेक्ट करें) *) - तो मैं प्रोटोकॉल के लिए डिफ़ॉल्ट मान लूंगा; आपने एक खाली फर्स्ट लेवल फोल्डर ( http : ** // **) दिया लेकिन मुझे पता है कि आपका क्या मतलब है?) इसके बाद एक पाथ सेगमेंट "google.com" ( http: / ** google.com / **) और फिर संसाधन "पेज" ( http://google.com ** पेज **)
mlhDev

9

यह मानते हुए कि हम केवल निरपेक्ष URI और HTTP अनुरोधों का समर्थन करना चाहते हैं, यहाँ एक फ़ंक्शन है जो वह करता है जो आप चाहते हैं:

public static bool IsValidURI(string uri)
{
    if (!Uri.IsWellFormedUriString(uri, UriKind.Absolute))
        return false;
    Uri tmp;
    if (!Uri.TryCreate(uri, UriKind.Absolute, out tmp))
        return false;
    return tmp.Scheme == Uri.UriSchemeHttp || tmp.Scheme == Uri.UriSchemeHttps;
}


1
तीसरे (और अंतिम) चेक को संभव बनाने के लिए दूसरे चेक की जरूरत होती है। इसके बिना, नहीं है tmp। पहला कदम यकीनन इस उदाहरण में बेमानी है ...
जो

1

मेरे मामले में मैं सिर्फ यूआरआई का परीक्षण करना चाहता था, मैं यूरि का परीक्षण करने वाले एप्लिकेशन को धीमा नहीं करना चाहता।

Boolean IsValidUri(String uri){
  return Uri.IsWellFormedUriString(uri, UriKind.Absolute);
}

0

आपके मामले में उरी तर्क एक पूर्ण मार्ग है जो एक फ़ाइल स्थान को संदर्भित करता है, इसलिए विधि के दस्तावेज़ के अनुसार यह गलत है। का संदर्भ लें इस


मैं UriKind.RelativeOrAbsolute का उपयोग कर रहा हूं, इसलिए इसे कोई फर्क नहीं पड़ना चाहिए। किसी भी तरह से यह UriKind के साथ काम नहीं करता है।
मैनुअल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.