1

我正在尝试使用 .NET 从有效网址中过滤掉无效网址。

我为此使用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);
    }
}

我正在尝试上面的代码,我希望它可以从列表中删除asaswww.joker.testtest但它没有。

有人可以帮我解决这个问题。

更新:刚刚尝试过Uri.IsWellFormedUriString这个也没有帮助。

更多更新

有效uri列表

无效uri列表

  • 阿萨斯
  • 作为#@SAd
  • 这无效
  • www.asa.toptoptop
4

6 回答 6

2

您似乎对究竟是什么 URL(或 URI,这里的区别不显着)感到困惑。例如,http://stackoverflow.com是一个有效的绝对 URL。另一方面,stackoverflow.com从技术上讲,它是一个有效的相对 URL,但它会引用stackoverflow.com当前目录中命名的文件,而不是具有该名称的网站。不过stackoverflow.com是注册域名

如果要检查域名是否有效,则需要定义“有效”的确切含义:

  1. 它是一个有效的域名吗?检查字符串是否由点分隔的部分组成,每个部分可以包含字母、数字和连字符 ( -)。例如,asasthis.not.valid都是有效的域名。
  2. 会不会是互联网域名?Internet 上的域名(与 Intranet 相对)的特定之处在于它们始终具有 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

试试这个:

公共静态布尔IsWellFormedUriString ( 字符串 uriString, UriKind uriKind )

或者,您可以使用 RegExp 来执行此操作,例如:

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

看看这份清单

于 2012-09-12T11:01:00.833 回答
1

问题是您在此处添加的所有 url 都不会被归类为绝对 URL。为此,您必须为其添加 URL 协议的前缀。

你可以测试并发现

www.stackoverflow.com - 相对 URL
http://www.stackoverflow.com - 绝对 URL
//www.stackoverflow.com - 绝对 URL(这并不奇怪。请参阅 RFC 3986:“统一资源标识符(URI):通用语法” ,第 4.2 节

关键是您必须至少添加前缀//以表明它是绝对 URL。

因此,简而言之,由于您的所有 URL 都是相对 URL,因此它通过了您的所有测试。

于 2012-09-12T11:26:48.223 回答
0

您所有的示例都是有效的,
有些是绝对 URL,有些是相对的,这就是为什么没有一个被删除。

否则,对于每个 Uri,您可能会尝试构建一个HttpWebRequest类,然后检查正确的响应。

于 2012-09-12T11:06:38.693 回答
0

在检查了其他人的答案后,我知道您不是在寻找域的存在并 ping 回您需要根据您的 GRAMMER ... 或域名语法来测试它们,对吗?

为此,您只需要依靠正则表达式测试......并制定适当的规则来评估域名,如果它们失败,则将它们从列表中排除。

您可以采用这些模式并对其进行修改以满足您的需要,然后使用列表中的每个元素对其进行测试。

于 2012-09-12T11:16:03.260 回答
-2

您所有的URIs 都是 Well-Formatted URIs,因此TryCreate不适IsWellFormedUriString用于您的情况。

这里开始,解决方案正在尝试打开 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 回答