web-dev-qa-db-ja.com

URI文字列が有効であることを確認する方法

Uri文字列が有効であることをどのように確認しますか(それをUriコンストラクタに渡すことができます)?

これまでのところ、私は次のものしか持っていませんが、明白な理由のために、私はそれほど野bruな方法を好まないでしょう:

    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コンストラクターは、デフォルトでkind Absoluteを使用します。これは、Uri.TryCreateとコンストラクターを使用しようとしたときに矛盾を引き起こしていました。コンストラクターとTryCreateの両方でUriKindを一致させると、期待どおりの結果が得られます。

59
Manuel

整形式のURIは、特定のRFCに準拠していることを意味します。例のローカルパスはこれらに準拠していません。詳細は IsWellFormedUriString のドキュメントをご覧ください。

そのメソッドからの偽の結果は、Uriクラスが入力を解析できないことを意味しません。 URI入力はRFCに準拠していない場合がありますが、有効なURIである可能性があります。

Update:そしてあなたの質問に答えるために-Uriドキュメントが示すように、 TryCreate と呼ばれる静的メソッドがあります=それはあなたが望むものを正確に試行し、trueまたはfalseを返します(trueの場合は実際のUriインスタンス)。

71
Franci Penov

受け入れられた答えは明示的な例を提供していないため、C#でURIを検証するためのコードを次に示します。

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...
}
31
DiscDev

絶対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;
}
7
cdiggins

あなたの場合、uri引数はファイルの場所を参照する絶対パスであるため、メソッドのドキュメントに従ってfalseを返します。 this を参照してください

0
Vijay Sirigiri