2011-01-29 5 views
48

URI文字列が有効であること(Uriコンストラクタに渡すことができます)を確認するにはどうすればよいですか?私はUri.IsWellFormedUriStringしようとしたが、あなたがに投げることができるすべてのものが好きなようには見えないuri文字列が有効であることを確認する方法

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

これまでのところ私は、次のを持っているが、私はあまりブルート方法を好む明白な理由のためにコンストラクタたとえば:

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.TryCreateとコンストラクタを使用しようとすると、これは不一致を引き起こしていました。コンストラクタとTryCreateの両方に対してUriKindをマッチさせると、期待される結果が得られます。

おかげで、あなたのケースで

+1

良い機能を作りました! +1 –

+9

質問の編集として回答を追加しないでください。既存の回答に何かを追加する場合は、別の回答として追加します。あなたの質問から回答を編集してください。 –

+1

[文字列が有効なHTTP URLであるかどうかをチェックする方法]の複製が可能ですか?(http://stackoverflow.com/questions/7578857/how-to-check-whether-a-string-is-a-valid-http -url) – Amalea

答えて

53

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

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

更新:そして、あなたの質問に答えるために - (trueの場合と実際のUriインスタンス)ウリの文書が示すように、正確に何をしたいしようとすると、trueまたはfalseを返しますTryCreateという静的メソッドがあります。

+0

質問は "あなたはUriコンストラクタにそれを供給することができますか?" – Manuel

+1

TryCreateは、文字列がコンストラクタによって受け入れられるかどうかをあなたに伝えません。更新を参照してください。 – Manuel

+0

@Manuel:それはまったく意味がありません - 'TryCreate'と' Uri'コンストラクタの結果は同じでなければなりません。 'TryCreate'のように' UriKind'を渡そうとしてください。 – BrokenGlass

0

URI引数は、それがfalseを返すメソッドのDOC当たりように、ファイルの場所を指す絶対パスです。 this

+0

私はUriKindを使用しています。RelativeOrAbsoluteので、問題ではありません。いずれにしても、UriKindでは動作しません.RelativeまたはUriKind.Absoluteので運がありません。 – Manuel

25

受け入れ答えは、明示的な例を提供していないので、ここでは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... 
} 
+1

Uri.TryCreate関数を信頼しないでください!これにより、不正なURLも許可されます。この「http:// http:// google.com/page」を試してください(スペースを削除してください)。このURLはTryCreate関数を渡しますが、間違っています。 – No1Lives4Ever

+2

@ No1Lives4Everあなたが言及したものが有効であると解釈するのは正しいですが、これは技術的に間違っていません。英語の説明:httpプロトコル(** http:// **)を使用して、http(http:// ** http **)のDNSエントリに明示的(ただし省略)のポート(http :// http **:**) - プロトコルのデフォルトを仮定します。空の第1レ​​ベルのフォルダ(http:// http:** // **)を提供しましたが、あなたの意図を知っています;)パスセグメント "google.com"(http:// http:// ** google.com/**)とリソース "ページ"(http://google.com/**page**) – mlhDev

3

は、我々は唯一絶対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; 
} 
+4

.Netソース[あなたの2番目のチェック**!Uri.TryCreate uri、UriKind.Absolute、out tmp)**は、IsWellFormedUriStringメソッドに既にTryCreateメソッド呼び出しが含まれているため、冗長です**](http://referencesource.microsoft.com/#System/net/System/UriExt.cs,24b1613846e7f879) –

+0

第3の(そして最終的な)検査を可能にするために第2の検査が必要である。それがなければ、tmpはありません。この場合、最初のステップはおそらく重複しています... – Joe

関連する問題