文字列が有効なHTTP URLかどうかを確認するにはどうすればよいですか?


251

Uri.IsWellFormedUriStringUri.TryCreateメソッドはありますが、trueファイルパスなどに対して返されるようです。

文字列が入力検証の目的で有効な(必ずしもアクティブではない)HTTP URLかどうかを確認するにはどうすればよいですか?


URLの検証にregex.IsMatchを使用しないでください。CPUを殺すことができます。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
これは、uriName.SchemeではなくuriResult.Schemeを読み取る必要がありますか?最初のパラメーターとして、Uriの代わりにStringを受け取るTryCreateにオーバーロードを使用しています。

7
uriResult.Scheme == ...具体的にはhttpsに条件を追加したい場合があります。それはあなたがこれを何のために必要とするかに依存しますが、この小さな変更はそれが私にとって完璧に機能するために必要なすべてでした。
Fiarr 2014年

11
Fiarrさんのコメント@明確あたりにするために、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であると述べています。
Kailash P

7
このテクニックは75テストのうち22テストdotnetfiddle.net/XduN3A
ホイットニーランド

98

この方法は、httpとhttpsの両方で正常に機能します。たった1行:)

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

MSDN:IsWellFormedUriString


13
これは、HTTP以外のURI(つまり、またはなどの他のスキーム)に対してtrueを返します。このソリューションは、スキームに対するチェックと組み合わせる必要があります。例file://ldap://if (uri.Scheme != Uri.UriSchemeHttp && uri.Scheme != Uri.UriSchemeHttps) ...
Squiggle

これはRFC3986に準拠していますか?
マーカス

3
@Squiggleそれはまさに私がそれをチェックしたいものです、私がダウンローダーを作っているので、すべて。したがって、この答えは私にとって最良の方法です。
ビヨンド

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
}

更新:(コードの1行)ありがとう@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のURLを処理していないようです。IE:www.google.comは無効として表示されます。
Zauber Paracelsus 2016

6
@ZauberParacelsus "www.google.com"は無効です。URLの平均値は、「HTTP」で始まる「FTP」、「ファイル」などの文字列は、あるべきはずです:スペースなし「のhttp // www.google.com」
ErçinDedeoğlu

1
今日、outパラメータは改善をUri.TryCreate(source, UriKind.Absolute, out Uri uriResult) && uriResult.Scheme == Uri.UriSchemeHttps
もたらす

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」のような単一の単語を通過させますが、Uri.IsWellFormedUriStringと組み合わせて使用​​すると良いでしょう
Epirocks

@Epirocksそれは良い点です。問題は、それhttp://moooooooooが実際には有効なUriであることです。したがって、Uri.IsWellFormedUriString「http://」を挿入した後はチェックできず、前にチェックした場合、「」がないものSchemeはすべて拒否されます。多分できることはs.Contains('.')代わりにチェックすることです。
Ahmed Abdelhameed

moooooo自体にはプロトコルがないため、URLのようには見えません。私がしたことは、あなたの正規表現一致呼び出しを取り出し、IsWellFormedUriStringで&&したことです。
Epirocks

@Epirocksまさに!問題は、をIsWellFormedUriString追加する前に使用した場合http://、次のようなものを拒否することにgoogle.comなり、を追加した後に使用した場合http://でも、に対してtrueが返されることですhttp://mooooooooo。そのため、.代わりに文字列にが含まれているかどうかを確認することを提案しました。
アーメドアブデルハミード

とにかく、httpまたはhttpsなしでURLを受け入れたくありません。したがって、最初にIsWellFormedUriStringを使用してから、正規表現なしで関数を使用します。bool bResult =(Uri.IsWellFormedUriString(s、UriKind.Absolute)&& ValidHttpURL(s、out uriResult)); ありがとう
Epirocks


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

それはそのようなURLを受け入れます:

  • http(s)://www.example.com
  • http(s)://stackoverflow.example.com
  • http(s)://www.example.com/page
  • http(s)://www.example.com/page?id = 1&product = 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
OPは具体的に言及したと思いますが、ファイルパスに当てはまるため、Uri.IsWellFormedUriStringは好きではありません。この問題の解決策はありますか?
イサンティポフ2014年

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

これurlは、テストする必要がある文字列です。


3
null == urlチェックは恐ろしく冗長です
JSON

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

あなたの答えは低品質の投稿にありました。コードは自明ですが、説明を入力してください。
Harsha Biyani
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.