1

.NET を使用して、有効な URL から無効な URL を除外しようとしています。

これにはUri.TryCreate()メソッドを使用しています。

次の構文があります

public static bool TryCreate(Uri baseUri,string relativeUri,out Uri result)

今、私はこれをやっています....

Uri uri = null;

var domainList = new List<string>();
domainList.Add("asas");
domainList.Add("www.stackoverflow.com");
domainList.Add("www.codera.org");
domainList.Add("www.joker.testtest");
domainList.Add("about.me");
domainList.Add("www.ma.tt");

var correctList = new List<string>();

foreach (var item in domainList)
{
    if(Uri.TryCreate(item, UriKind.RelativeOrAbsolute, out uri))
    {    
        correctList.Add(item);
    }
}

asas上記のコードを試していますが、www.joker.testtestリストから削除することを期待していますが、そうではありません。

誰かがこれについて私を助けることができますか?

更新:Uri.IsWellFormedUriStringこれも試してみましたが、役に立ちませんでした。

もっとアップデート

有効な uri のリスト

無効な uri のリスト

  • と同じように
  • as#@SAd
  • this.not.valid
  • www.asa.toptoptop
4

6 に答える 6

2

あなたは正確に URL (または URI、違いはここでは重要ではありません) について混乱しているようです。たとえば、http://stackoverflow.comは有効な絶対 URL です。一方、stackoverflow.comは技術的に有効な相対 URL ですが、stackoverflow.comその名前の Web サイトではなく、現在のディレクトリで指定されたファイルを参照します。しかしstackoverflow.com、登録されたドメイン名です。

ドメイン名が有効かどうかを確認したい場合は、「有効」とは正確に何を意味するのかを定義する必要があります。

  1. 有効なドメイン名ですか? 文字列がドットで区切られた部分で構成されているかどうかを確認します。各部分には、文字、数字、およびハイフン ( -) を含めることができます。たとえば、asasthis.not.validはどちらも有効なドメイン名です。
  2. インターネットドメイン名でしょうか?(イントラネットではなく) インターネット上のドメイン名は、常に TLD (トップレベル ドメイン) を持っているという点で固有です。したがって、asas確かにインターネット ドメイン名ではありませんが、そうであるthis.not.valid可能性があります。
  3. 既存のTLDのドメイン名ですか?すべての TLD のリストをダウンロードして、それと照合することができます。たとえば、this.not.validこのルールでは有効とは見なされませんが、有効ですthisisnotvalid.com
  4. 登録済みのドメイン名ですか?
  5. ドメイン名は IP アドレスに解決されますか? ドメイン名は登録できますが、DNS レコードに IP アドレスが含まれていない可能性があります。
  6. ドメイン名が指すコンピューターは要求に応答しますか? 最も理にかなっている要求は、単純な HTTP 要求 (アクセスしようとするhttp://domaininquestion/など) または ping です。
于 2012-09-12T12:15:12.287 に答える
1

問題は、ここに追加した URL がいずれも絶対 URL として分類されないことです。そのためには、URL のプロトコルを前に付ける必要があります。

あなたはそれをテストして見つけることができます

www.stackoverflow.com - 相対 URL
http://www.stackoverflow.com - 絶対 URL
//www.stackoverflow.com - 絶対 URL (ここで驚きはありません。RFC 3986 を参照してください: "Uniform Resource Identifier (URI): Generic Syntax" 、セクション 4.2 )

ポイントは、少なくとも//絶対 URL であることを示すためにプレフィックスを付ける必要があるということです。

要するに、すべての URL が相対 URL であるため、すべてのテストに合格します。

于 2012-09-12T11:26:48.223 に答える
1

これを試してください:

public static bool IsWellFormedUriString (文字列 uriString, UriKind uriKind )

または、次のように RegExp を使用してこれを行うこともできます。

^http\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(/\S*)?$

このリストを見てください

于 2012-09-12T11:01:00.833 に答える
0

すべての例は有効であり、
一部は絶対URLであり、一部は相対URLであるため、削除されるものはありません。

それ以外の場合は、URIごとに、HttpWebRequestクラスを作成してから、正しい応答を確認することができます。

于 2012-09-12T11:06:38.693 に答える
0

他の人の回答を確認した後、ドメインの存在を探しておらず、GRAMMERに基づいてテストする必要があることを認識しています...またはドメイン名の構文は正しいですか?

そのためには、正規表現テストのみに頼る必要があります...そしてドメイン名を評価するための適切なルールを作成し、失敗した場合はリストから除外します。

これらのパターンを採用し、必要に応じてパターンを変更してから、リスト内のすべての要素でテストできます。

于 2012-09-12T11:16:03.260 に答える
-2

すべてURIのが適切にフォーマットされてURIいるためTryCreateIsWellFormedUriStringこの場合は機能しません。

ここから、ソリューションはURIを開こうとしています。

using(var client = new MyClient()) {
    client.HeadOnly = true;
    // fine, no content downloaded
    string s1 = client.DownloadString("www.stackoverflow.com");
    // throws 404
    string s2 = client.DownloadString("www.joker.testtest");
}
于 2012-09-12T11:08:23.317 に答える