如何检查网址是不是有效[重复]
Posted
技术标签:
【中文标题】如何检查网址是不是有效[重复]【英文标题】: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.***.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列表
http://www.ggogle.com www.abc.com www.aa.org www.aas.co www.hhh.net www.ma.tt无效uri列表
asas 作为#@SAd this.not.valid www.asa.toptoptop【问题讨论】:
joshua-smith.net/articles/view-article/3/… 看看这个:***.com/questions/924679/… 您对有效 URI 的定义是什么?您的所有示例都是有效的 URI,但并非所有示例都是真正的 域。 您需要定义“无效”。如果“无效”意味着 URI 不存在,那么我的解决方案将起作用。如果“无效”表示“格式不正确”,则 O.D.解决方案就足够了。否则,您需要定义“无效”!MUSEUM
也是一个有效的***域。所以像“www.asa.MUSEUM”这样的东西是有效的吗?在这里检查 tlds:data.iana.org/TLD/tlds-alpha-by-domain.txt
【参考方案1】:
您似乎对究竟是什么 URL(或 URI,这里的区别并不显着)感到困惑。例如,http://***.com
是一个有效的绝对 URL。另一方面,***.com
在技术上是一个有效的相对 URL,但它会引用当前目录中名为 ***.com
的文件,而不是具有该名称的网站。但是***.com
是一个注册的域名。
如果你想检查一个域名是否有效,你需要定义你所说的“有效”到底是什么意思:
-
它是一个有效的域名吗?检查字符串是否由点分隔的部分组成,每个部分可以包含字母、数字和连字符(
-
)。例如,asas
和 this.not.valid
都是有效的域名。
可以是 Internet 域名吗? Internet 上的域名(与 Intranet 相对)的特定之处在于它们始终具有 TLD(***域)。所以,asas
肯定不是互联网域名,但this.not.valid
可能是。
它是现有 TLD 下的域名吗?您可以下载the list of all TLDs 并进行检查。例如,this.not.valid
在此规则下不会被视为有效,但thisisnotvalid.com
会。
是注册域名吗?
域名是否解析为 IP 地址?可以注册一个域名,但它的 DNS 记录中可能仍然没有 IP 地址。
域名指向的计算机是否响应请求?最有意义的请求是简单的 HTTP 请求(例如,尝试访问 http://domaininquestion/
)或 ping。
【讨论】:
【参考方案2】:试试这个:
公共静态布尔IsWellFormedUriString( 字符串 uriString, UriKind uriKind )
或者您也可以使用 RegExp 来执行此操作,例如:
^http\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]2,3(/\S*)?$
看看这个list
【讨论】:
在阅读***.com/a/9356511/1182982后尝试,也不起作用 他们格式良好。正如 OP 在问题中添加的那样,它不能满足他的需求。 @Yasser 然后你必须发出请求并测试它是成功还是 404 错误【参考方案3】:问题是您在此处添加的所有 url 都不会被归类为绝对 URL。为此,您必须为其添加 URL 协议的前缀。
您可以测试并找出答案
www.***.com - 相对 URLhttp://www.***.com - 绝对 URL //www.***.com - 绝对 URL(这里不奇怪。Refer RFC 3986: "Uniform Resource Identifier (URI): Generic Syntax", Section 4.2)
关键是您必须至少添加前缀 //
以表明它是绝对 URL。
因此,简而言之,由于您的所有网址都是相对网址,因此它通过了您的所有测试。
【讨论】:
这解释了问题中的代码有什么问题,但它无助于修复它。【参考方案4】:你所有的例子都是有效的, 有些是绝对 URL,有些是相对的,所以没有一个会被删除。
对于每个 Uri,您可以尝试构建一个 HttpWebRequest
类
然后检查正确的响应。
【讨论】:
asas
和 www.joker.testtest
在列表中无效
从技术上讲,这是正确的。但是说www.***.com
是一个有效的相对URL 并不是正确的看待它的方式,因为这将代表当前目录中名为www.***.com
的文件。【参考方案5】:
在检查了其他人的答案后,我知道您不是在寻找域的存在并 ping 回您需要根据您的 GRAMMER... 或域名语法对它们进行测试吗?
为此,您只需要依赖正则表达式测试...并制定适当的规则来评估域名,如果它们失败,则将它们从列表中排除。
您可以adopt 这些模式并修改其中一个以满足您的需要,然后使用列表中的每个元素对其进行测试。
【讨论】:
【参考方案6】:您所有的URI
s 都是格式正确的URI
s,所以TryCreate
和IsWellFormedUriString
不适用于您的情况。
来自here,解决方案正在尝试打开URI:
using(var client = new MyClient())
client.HeadOnly = true;
// fine, no content downloaded
string s1 = client.DownloadString("www.***.com");
// throws 404
string s2 = client.DownloadString("www.joker.testtest");
【讨论】:
这里有什么MyClient
??以上是关于如何检查网址是不是有效[重复]的主要内容,如果未能解决你的问题,请参考以下文章