স্ট্রিংটি একটি বৈধ HTTP URL কিনা তা কীভাবে পরীক্ষা করবেন?


251

আছে Uri.IsWellFormedUriStringএবং Uri.TryCreateপদ্ধতি, কিন্তু তারা ফিরে বলে মনে হচ্ছে trueফাইল পাথ ইত্যাদি জন্য

ইনপুট বৈধকরণের জন্য কোনও স্ট্রিং একটি বৈধ (অগত্যা সক্রিয় নয়) এইচটিটিপি ইউআরএল কিনা তা আমি কীভাবে চেক করব?


ইউআরএলটিকে বৈধতা দেওয়ার জন্য রিজেেক্স.আইস ম্যাচটি মোটেও ব্যবহার করবেন না। সিপু মেরে ফেলতে পারে। stackoverflow.com/questions/31227785/...
inesmar

উত্তর:


451

এইচটিটিপি ইউআরএলগুলি যাচাই করার জন্য এটি চেষ্টা করুন ( uriNameআপনি যে ইউআরআই পরীক্ষা করতে চান):

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

অথবা, আপনি যদি HTTP এবং এইচটিটিপিএস উভয়ই URL টি বৈধ হিসাবে গ্রহণ করতে চান (J0e3gan এর মন্তব্যে):

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

6
এটি কি uriName.Scheme এর পরিবর্তে uriResult.Smeme পড়তে হবে? আমি ট্রিভারসেটে ওভারলোডটি ব্যবহার করছি যা এটি প্রথম প্যারামিটার হিসাবে উরির পরিবর্তে স্ট্রিং নেয় takes

7
আপনি uriResult.Scheme == ... বিশেষত https এ আরও শর্ত যুক্ত করতে চাইতে পারেন। এটি আপনার কী প্রয়োজন তার উপর নির্ভর করে তবে আমার পক্ষে পুরোপুরি কাজ করার জন্য এই ছোট পরিবর্তনটি আমার কেবল দরকার ছিল।
ফায়ার

11
@ ফায়ারের মন্তব্যে পরিষ্কার হওয়ার জন্য, এইচটিটিপিএল ইউআরএলগুলি ছাড়াও এইচটিটিপিএসের অ্যাকাউন্ট করার জন্য "ছোট পরিবর্তন "টি হ'ল: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 টির মধ্যে ব্যর্থ হয়েছে ডটনেটফিডাল.net
এক্সডুএন

98

এই পদ্ধতিটি http এবং https উভয়ই সূক্ষ্মভাবে কাজ করে। মাত্র একটি লাইন :)

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

এমএসডিএন: ইসওয়েলফর্মড ইউরিস্ট্রিং


13
এটি নন-এইচটিটিপি ইউআরআই-এর ক্ষেত্রে সত্য হয়ে উঠবে (যেমন অন্য কোনও স্কিম যেমন file://বা ldap://। এই সমাধানটি স্কিমের বিরুদ্ধে একটি চেকের সাথে তৈরি করা উচিত - যেমনif (uri.Scheme != Uri.UriSchemeHttp && uri.Scheme != Uri.UriSchemeHttps) ...
স্কুইগল

এটি কি আরএফসি 3986 এর অনুগত?
মার্কাস

3
ঠিক কি আমি এটি পরীক্ষা করতে চান @Squiggle, সবকিছু থেকে আমি একটি ডাউনলোডার তৈরি করছি। সুতরাং, এই উত্তরটি আমার পক্ষে সেরা পদ্ধতি।
27:51 এ 14

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 ইউআরএলগুলি হ্যান্ডেল করে না। IE: www.google.com অবৈধ হিসাবে দেখানো হয়েছে।
জাউবার প্যারাসেলসাস

6
@ ZauberParacelsus "www.google.com" অবৈধ। ইউআরএল অর্থ "http", "ftp", "ফাইল" ইত্যাদির সাথে শুরু হওয়া উচিত স্ট্রিংটি "http: // www.google.com" হওয়া উচিত
এরিন দেদেওলু

1
আজ, আউট প্যারামিটারটি উন্নতি করতে পারেUri.TryCreate(source, UriKind.Absolute, out Uri uriResult) && uriResult.Scheme == Uri.UriSchemeHttps
GoClimbColorado

11

এখানে সকল উত্তর পারেন অনুমতি স্কিমের সঙ্গে URL গুলি (যেমন, file://, ftp://) অথবা পাঠযোগ্য যে URL গুলি দিয়ে শুরু করবেন না প্রত্যাখ্যান 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" এর মতো একক শব্দের মাধ্যমে দেয় তবে এটি উরির সাথে মিলিতভাবে ব্যবহৃত হয় sআইসওয়েলফোর্ডইউরিস্ট্রিং ভাল হতে পারে
এপিরোকস

পছন্দ করেছেন সমস্যাটি হ'ল http://mooooooooo, আসলে একটি বৈধ উরি। অতএব, আপনি Uri.IsWellFormedUriString"http: //" সন্নিবেশ করার পরে চেক করতে পারবেন না এবং আপনি যদি এটির আগে পরীক্ষা করেন তবে যা কিছু নেই Schemeসেটিকে প্রত্যাখ্যান করা হবে। এর s.Contains('.')পরিবর্তে আমরা যা যা করতে পারি তা আমরা তার পরিবর্তে পরীক্ষা করে দেখছি।
আহমেদ আবদেলহামেদ

moooooo নিজেই কোনও url এর মতো লাগে না কারণ এতে কোনও প্রোটোকল নেই। আমি যা করেছি তা হ'ল আপনার রেজেক্স ম্যাচ কলটি করা, এবং & এডও ওয়েলফোর্ডেডউরিস্ট্রিংয়ের সাথে এটি সম্পাদনা করা।
এপিরোকস

@ এপিরকস ঠিক! সমস্যাটি হ'ল আপনি যদি IsWellFormedUriStringযোগ করার আগে ব্যবহার করেন তবে আপনি http://পছন্দ মতো জিনিসগুলি প্রত্যাখ্যান করবেন google.comএবং এটি যুক্ত করার পরে যদি আপনি এটি ব্যবহার করেন তবে এটি http://সত্য হয়ে যাবে http://mooooooooo। এজন্য আমি স্ট্রিংয়ের .পরিবর্তে কোনও স্ট্রিং রয়েছে কিনা তা পরীক্ষা করার পরামর্শ দিয়েছিলাম ।
আহমেদ আবদেলহামেদ

এটি আমার পক্ষে যাই হোক না কেন আমি কোনও url এটিতে http বা https ছাড়াই গ্রহণ করতে চাই না। সুতরাং আমি প্রথমে ইসওয়েলফর্মডউরিস্ট্রিং ব্যবহার করি, তারপরে আপনার রেজাল্ট ছাড়াই ফাংশনটি ব্যবহার করুন। bool bResult = (Uri.IsWellformedUriString (s, UriKind.Absolve) && ValidHttpURL (গুলি, uriResult)); ধন্যবাদ
এপিরোকস


3

চেষ্টা কর:

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

এটি এর মতো ইউআরএল গ্রহণ করবে:

  • HTTP (গুলি): //www.example.com
  • HTTP (গুলি): //stackoverflow.example.com
  • HTTP (গুলি): //www.example.com/page
  • HTTP (গুলি): //www.example.com/page আইডি = 1 & পণ্য = 2
  • HTTP (গুলি): //www.example.com/page#start
  • HTTP (গুলি): //www.example.com: 8080
  • HTTP (গুলি): //127.0.0.1
  • 127.0.0.1
  • www.example.com
  • example.com

2

এটি প্রত্যাবর্তন করবে:

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

2
আমি মনে করি ওপি বিশেষত উল্লেখ করেছে, তিনি উরি.আইএসওয়েলফোর্ডেডউরিস্ট্রিং পছন্দ করেন না কারণ এটি ফাইল পাথের ক্ষেত্রে সত্য দেয়। আপনার কি এই সমস্যার সমাধান আছে?
ইসানতিপভ

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

urlআপনি পরীক্ষা করতে হবে স্ট্রিং এখানে ।


3
নাল == URL টি চেক ভয়ঙ্করভাবে reduntant হয়
তাদেরকে JSON

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

আপনার উত্তর নিম্ন মানের পোস্টে এসেছিল। আপনার কোডটি স্বতঃস্পষ্ট বর্ণনীয় হলেও দয়া করে কিছু ব্যাখ্যা সরবরাহ করুন।
হর্ষ বিয়ানি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.