【问题标题】:How to check if a url is valid or not [duplicate]如何检查网址是否有效[重复]
【发布时间】:2012-09-05 09:12:08
【问题描述】:

我正在尝试使用 .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列表

  • asas
  • 作为#@SAd
  • this.not.valid
  • www.asa.toptoptop

【问题讨论】:

  • 您对有效 URI 的定义是什么?您的所有示例都是有效的 URI,但并非所有示例都是真正的
  • 您需要定义“无效”。如果“无效”意味着 URI 不存在,那么我的解决方案将起作用。如果“无效”表示“格式不正确”,则 O.D.解决方案就足够了。否则,您需要定义“无效”!
  • MUSEUM 也是一个有效的顶级域。所以像“www.asa.MUSEUM”这样的东西是有效的吗?在这里检查 tlds:data.iana.org/TLD/tlds-alpha-by-domain.txt

标签: c# asp.net .net uri


【解决方案1】:

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

如果你想检查一个域名是否有效,你需要定义你所说的“有效”到底是什么意思:

  1. 它是一个有效的域名吗?检查字符串是否由点分隔的部分组成,每个部分可以包含字母、数字和连字符(-)。例如,asasthis.not.valid 都是有效的域名。
  2. 可以是 Internet 域名吗? Internet 上的域名(与 Intranet 相对)的特定之处在于它们始终具有 TLD(顶级域)。所以,asas 肯定不是互联网域名,但this.not.valid 可能是。
  3. 它是现有 TLD 下的域名吗?您可以下载the list of all TLDs 并进行检查。例如,this.not.valid 在此规则下不会被视为有效,但thisisnotvalid.com 会。
  4. 是注册域名吗?
  5. 域名是否解析为 IP 地址?可以注册一个域名,但它的 DNS 记录中可能仍然没有 IP 地址。
  6. 域名指向的计算机是否响应请求?最有意义的请求是简单的 HTTP 请求(例如,尝试访问 http://domaininquestion/)或 ping。

【讨论】:

    【解决方案2】:

    试试这个:

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

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

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

    看看这个list

    【讨论】:

    • 在阅读stackoverflow.com/a/9356511/1182982后尝试,也不起作用
    • 他们格式良好。正如 OP 在问题中添加的那样,它不能满足他的需求。
    • @Yasser 然后你必须发出请求并测试它是成功还是 404 错误
    【解决方案3】:

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

    您可以测试并找出答案

    www.stackoverflow.com - 相对 URL
    http://www.stackoverflow.com - 绝对 URL
    //www.stackoverflow.com - 绝对 URL(这里不奇怪。Refer RFC 3986: "Uniform Resource Identifier (URI): Generic Syntax", Section 4.2

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

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

    【讨论】:

    • 这解释了问题中的代码有什么问题,但它无助于修复它。
    【解决方案4】:

    你所有的例子都是有效的,
    有些是绝对 URL,有些是相对的,所以没有一个会被删除。

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

    【讨论】:

    • asaswww.joker.testtest 在列表中无效
    • 从技术上讲,这是正确的。但是说www.stackoverflow.com 是一个有效的相对URL 并不是正确的看待它的方式,因为这将代表当前目录中名为www.stackoverflow.com 的文件。
    【解决方案5】:

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

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

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

    【讨论】:

      【解决方案6】:

      您所有的URIs 都是格式正确的URIs,所以TryCreateIsWellFormedUriString 不适用于您的情况。

      来自here,解决方案正在尝试打开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");
      }
      

      【讨论】:

      • 这里有什么MyClient ??
      猜你喜欢
      • 2013-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      • 2014-07-10
      • 1970-01-01
      • 2021-07-30
      相关资源
      最近更新 更多