2012-09-12 57 views
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的列表

  • ASAS
  • 为#@伤心
  • this.not.valid
  • www.asa.toptoptop
+0

http://joshua-smith.net/articles/view-article/3/Check-if-a-URL-is-valid-with-C –

+0

看看这个:http:// stackoverflow .com/questions/924679/c-sharp-how-can-i-check-if-a-url-exists-is-valid – Star

+0

什么是您对有效URI的定义?你所有的例子都是有效的URI,尽管不是全部都是真实的_domains_。 – Oded

回答

2

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

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

  1. 它是一个有效的域名?检查字符串是否由用点分隔的部分组成,每个部分可以包含字母,数字和连字符(-)。例如,asasthis.not.valid都是有效的域名。
  2. 它可能是一个互联网域名吗?互联网上的域名(而不是内部网)是特定的,因为它们始终有一个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。
1

试试这个:

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

或者Alternativly你可以做到这一点使用正则表达式,如:

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

在这个list

+0

从http:// stackoverflow读取后尝试。 com/a/9356511/1182982,不工作或者 – Yasser

+0

他们很好形成,并且随着OP添加到问题中,它不适合他的需求。 – Oded

+0

@Yasser然后你将不得不提出请求并测试它的成功或404错误 – V4Vendetta

0

采取alook你所有的例子都是有效的,
有些是绝对URL,有些是相对的,这就是为什么没有被删除。

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

+0

'asas'和'www.joker.testtest'从列表中无效 – Yasser

+0

从技术上讲,这是正确的。但是说'www.stackoverflow.com'是一个有效的相对URL不是正确的方式来看待它,因为这将代表当前目录中名为'www.stackoverflow.com'的文件。 – svick

-1

你所有的URI都是格式良好的URI s所以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"); 
} 
+0

whats'MyClient' here? – Yasser

+0

检查链接plz – MBZ

0

检查其他的答案我知道你是不是在找域和ping的存在后回来,你需要根据测试它们的GRAMMER ...或者域名的语法正确吗?

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

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

1

问题是,您在此处添加的任何网址都不会归为绝对网址。为此,你必须在URL的协议前加上它。

您可以测试并找出

www.stackoverflow.com - 相对URL
http://www.stackoverflow.com - 绝对URL
//www.stackoverflow.com - (这里没有惊喜Refer RFC 3986: "Uniform Resource Identifier (URI): Generic Syntax", Section 4.2)绝对URL

问题是,您必须在前缀//前面显示其绝对URL。

所以,简而言之,因为所有的URL都是相对URL,它会通过所有的测试。

+1

这个解释s问题中的代码有什么问题,但它无法解决问题。 – svick