कैसे जांचें कि एक स्ट्रिंग एक वैध HTTP URL है?


251

वहाँ Uri.IsWellFormedUriStringऔर Uri.TryCreateतरीके हैं, लेकिन वे वापस लौटने लगते हैंtrue फ़ाइल पथ आदि के हैं।

मैं कैसे जांचूं कि क्या एक स्ट्रिंग वैध है (जरूरी नहीं कि सक्रिय) HTTP URL इनपुट सत्यापन प्रयोजनों के लिए है?


Url को मान्य करने के लिए regex.IsMatch का उपयोग बिल्कुल न करें। सीपीयू को मार सकते हैं। stackoverflow.com/questions/31227785/…
inesmar

जवाबों:


452

HTTP URL को मान्य करने के लिए इसे आज़माएं ( uriNameक्या आप जिस URI का परीक्षण करना चाहते हैं):

Uri uriResult;
bool result = Uri.TryCreate(uriName, UriKind.Absolute, out uriResult) 
    && uriResult.Scheme == Uri.UriSchemeHttp;

या, यदि आप HTTP और HTTPS URL दोनों को मान्य के अनुसार स्वीकार करना चाहते हैं (J0e3gan की टिप्पणी के अनुसार):

Uri uriResult;
bool result = Uri.TryCreate(uriName, UriKind.Absolute, out uriResult) 
    && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps);

6
क्या इसे uriNult.Scheme के बजाय uriResult.Scheme पढ़ना चाहिए? मैं TryCreate के लिए अधिभार का उपयोग कर रहा हूं जो कि Uri के बजाय स्ट्रिंग लेता है क्योंकि यह पहला पैरामीटर है।

7
आप अधिक शर्तों को uriResult.Scheme == ... विशेष रूप से https में जोड़ना चाहते हैं। यह इस बात पर निर्भर करता है कि आपको इसके लिए क्या चाहिए, लेकिन यह छोटा सा बदलाव इसके लिए जरूरी था कि मैं इसके लिए पूरी तरह से काम करूं।
19

11
@ फियर की टिप्पणी के अनुसार स्पष्ट होने के लिए, HTTP URL के अलावा HTTPS के लिए "छोटे परिवर्तन" की आवश्यकता है:bool result = Uri.TryCreate(uriName, UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps;
J0e3gan

3
यह तरीका abcde जैसे URL के लिए विफल रहता है । यह कहता है कि यह एक मान्य URL है।
कैलाश पी।

7
इस तकनीक की तरह दिखता है 75 परीक्षणों के 22 बाहर में विफल रहता है dotnetfiddle.net/XduN3A
whitneyland

98

यह तरीका http और https दोनों में ठीक काम करता है। बस एक लाइन :)

if (Uri.IsWellFormedUriString("https://www.google.com", UriKind.Absolute))

MSDN: IsWellFormedUriString


13
यह सच है के लिए गैर- HTTP यूआरआई यानी वापस आ जाएगी ( किसी अन्य योजना जैसे file://या ldap://यह समाधान योजना के खिलाफ एक चेक के साथ मिलकर किया जाना चाहिए -। उदाहरण के लिएif (uri.Scheme != Uri.UriSchemeHttp && uri.Scheme != Uri.UriSchemeHttps) ...
विद्रूप

क्या यह RFC3986 अनुपालन है?
मार्कस

3
@ मुझे लगता है कि मैं इसे डाउनलोड करने के बाद से सब कुछ जाँचना चाहता हूँ। तो, यह जवाब मेरे लिए सबसे अच्छा तरीका है।
बियॉन्डो

24
    public static bool CheckURLValid(this string source)
    {
        Uri uriResult;
        return Uri.TryCreate(source, UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp;
    }

उपयोग:

string url = "htts://adasd.xc.";
if(url.CheckUrlValid())
{
  //valid process
}

अद्यतन: (कोड की एक पंक्ति) धन्यवाद @GoClimbColorado

public static bool CheckURLValid(this string source) => Uri.TryCreate(source, UriKind.Absolute, out Uri uriResult) && uriResult.Scheme == Uri.UriSchemeHttps;

उपयोग:

string url = "htts://adasd.xc.";
if(url.CheckUrlValid())
{
  //valid process
}

यह www urls को संभालने के लिए प्रकट नहीं होता है। IE: www.google.com को अमान्य के रूप में दिखाया गया है।
ज़ुबेर पैरासेल्सस

6
@ZauberParacelsus "www.google.com" अमान्य है। URL का मतलब "http", "ftp", "फ़ाइल" आदि से शुरू होना चाहिए। स्ट्रिंग "http: // www.google.com" बिना स्पेस के होनी चाहिए
Erçin Dedeoğlu

1
आज, आउट पैरामीटर एक सुधार कर सकता हैUri.TryCreate(source, UriKind.Absolute, out Uri uriResult) && uriResult.Scheme == Uri.UriSchemeHttps
GoClimbColorado

11

यहाँ सभी जवाब या तो अनुमति देने के अन्य योजनाओं के साथ यूआरएल (जैसे, file://, ftp://) या मानव पठनीय यूआरएल है कि के साथ शुरू नहीं करना अस्वीकार http://या https://(जैसे, www.google.com) जो अच्छा नहीं है जब उपयोगकर्ता इनपुट के साथ काम कर

यहां बताया गया है कि मैं इसे कैसे करता हूं:

public static bool ValidHttpURL(string s, out Uri resultURI)
{
    if (!Regex.IsMatch(s, @"^https?:\/\/", RegexOptions.IgnoreCase))
        s = "http://" + s;

    if (Uri.TryCreate(s, UriKind.Absolute, out resultURI))
        return (resultURI.Scheme == Uri.UriSchemeHttp || 
                resultURI.Scheme == Uri.UriSchemeHttps);

    return false;
}

उपयोग:

string[] inputs = new[] {
                          "https://www.google.com",
                          "http://www.google.com",
                          "www.google.com",
                          "google.com",
                          "javascript:alert('Hack me!')"
                        };
foreach (string s in inputs)
{
    Uri uriResult;
    bool result = ValidHttpURL(s, out uriResult);
    Console.WriteLine(result + "\t" + uriResult?.AbsoluteUri);
}

आउटपुट:

True    https://www.google.com/
True    http://www.google.com/
True    http://www.google.com/
True    http://google.com/
False

1
यह "mooooooooo" जैसे एकल शब्दों के माध्यम से अनुमति देता है, लेकिन Uri.IsWellFormedUriString के साथ संयोजन के रूप में इस्तेमाल किया जा सकता है
एपिरॉक्स

@Epirocks यह एक अच्छी बात है। समस्या यह है कि http://moooooooooवास्तव में, एक वैध उड़ी है। इसलिए, आप Uri.IsWellFormedUriString"http: //" डालने के बाद जांच नहीं कर सकते हैं और यदि आप इसके लिए पहले जांच करते हैं, तो ऐसी कोई भी चीज जिसे Schemeअस्वीकार नहीं किया जाएगा। शायद जो किया जा सकता है, उसके s.Contains('.')बदले हम जाँच करें ।
अहमद अब्देलहामेद

moooooo अपने आप में एक यूआरएल की तरह नहीं दिखता है क्योंकि इसका कोई प्रोटोकॉल नहीं है। मैंने जो किया, वह आपके regex मैच कॉल को निकाल दिया, और & # 39; इसे IsWellFormedUriString के साथ संपादित किया।
इपिरॉक्स

@Epirocks बिल्कुल! समस्या यह है कि यदि आप उपयोग करते हैंIsWellFormedUriString जोड़ने से पहलेhttp:// करते हैं, google.comतो आप चीजों को अस्वीकार कर देंगे जैसे और यदि आप इसे जोड़ने के बाद उपयोग करते हैं http://, तो यह अभी भी सही होगा http://mooooooooo। इसलिए मैंने सुझाव दिया है कि अगर स्ट्रिंग के .बजाय इसकी जाँच हो ।
अहमद अब्देलहामेद

वैसे भी मेरे लिए यह ठीक है कि मैं उस पर http या https के बिना एक url स्वीकार नहीं करना चाहता। इसलिए मैं पहले IsWellFormedUriString का उपयोग करता हूं, फिर रेगेक्स के बिना अपने फ़ंक्शन का उपयोग करता हूं। bool bResult = (Uri.IsWellFormedUriString (s, UriKind.Absolute) && ValidHttpURL (s, uriResult)); धन्यवाद
Epirocks

5

बाद Uri.TryCreateआप जाँच कर सकते हैं Uri.Schemeअगर यह HTTP (रों) को देखने के लिए।


4

उसकी कोशिश करो:

bool IsValidURL(string URL)
{
    string Pattern = @"^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!\$&'\(\)\*\+,;=.]+$";
    Regex Rgx = new Regex(Pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
    return Rgx.IsMatch(URL);
}

यह URL को इस तरह स्वीकार करेगा:

  • http (s): //www.example.com
  • http (s): //stackoverflow.example.com
  • http (s): //www.example.com/page
  • http (s): //www.example.com/page आईडी = 1 & उत्पाद = 2
  • http (s): //www.example.com/page#start
  • http (s): //www.example.com: 8080
  • http (s): //127.0.0.1
  • 127.0.0.1
  • www.example.com
  • example.com

2

यह बूल लौटेगा:

Uri.IsWellFormedUriString(a.GetAttribute("href"), UriKind.Absolute)

2
मुझे लगता है कि ओपी ने विशेष रूप से उल्लेख किया है, वह Uri.IsWellFormedUriString पसंद नहीं करता है क्योंकि यह फ़ाइल पथ के लिए सही है। क्या आपके पास इस समस्या का हल है?
इस्तिनिपोव

1
Uri uri = null;
if (!Uri.TryCreate(url, UriKind.Absolute, out uri) || null == uri)
    return false;
else
    return true;

यहां urlवह स्ट्रिंग है जिसका आपको परीक्षण करना है।


3
null == url check बहुत ही निरर्थक है
JSON

0
bool passed = Uri.TryCreate(url, UriKind.Absolute, out Uri uriResult) && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps)

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