C# 将网址转换为有效的href值
首先,这似乎是以前应该问的问题,但我找不到任何答案 我的任务的基本概述是在基于用户定义的web地址的网页上呈现锚定链接。由于地址由用户定义,因此可以采用任何格式,例如:C# 将网址转换为有效的href值,c#,asp.net,.net,asp.net-mvc-3,url,C#,Asp.net,.net,Asp.net Mvc 3,Url,首先,这似乎是以前应该问的问题,但我找不到任何答案 我的任务的基本概述是在基于用户定义的web地址的网页上呈现锚定链接。由于地址由用户定义,因此可以采用任何格式,例如: www.example.com example.com 我需要使用该值将其设置为锚定标记的href属性。现在,问题是(至少在Chrome中)只有前两个示例可以工作,因为它们被认为是绝对URL路径。最后两个示例将重定向到同一个域(即被视为相对路径) 因此,最终的问题是:格式化这些值以确保使用一致的绝对路径的最佳方式是什么?
- www.example.com
- example.com
href
属性。现在,问题是(至少在Chrome中)只有前两个示例可以工作,因为它们被认为是绝对URL路径。最后两个示例将重定向到同一个域(即被视为相对路径)
因此,最终的问题是:格式化这些值以确保使用一致的绝对路径的最佳方式是什么?我可以检查http/https,如果丢失了就添加它,但我希望有一个现成的.Net类更可靠
此外,由于这是一个用户定义的值,它可能是完全的垃圾,因此验证URL的函数也是一个不错的奖励。几个月前我们遇到了这个问题,需要一种一致的方法来确保URL是绝对的。我们还需要一种方法来删除http(s)://,以便在网页上显示URL 我想出了这个函数:
public static string FormatUrl(string Url, bool IncludeHttp = null)
{
Url = Url.ToLower();
switch (IncludeHttp) {
case true:
if (!(Url.StartsWith("http://") || Url.StartsWith("https://")))
Url = "http://" + Url;
break;
case false:
if (Url.StartsWith("http://"))
Url = Url.Remove(0, "http://".Length);
if (Url.StartsWith("https://"))
Url = Url.Remove(0, "https://".Length);
break;
}
return Url;
}
我知道你在寻找一个“开箱即用”的图书馆,但这可能会有所帮助
我认为“开箱即用”解决方案的问题在于,函数不知道URL应该是
http://
还是https://
。对于我的函数,我假设它将是http://
,但对于某些URL,您需要https://
。如果Microsoft要在框架中构建类似的内容,那么从一开始就存在问题。您可以尝试使用Uri类的重载:
此构造函数从Uri字符串创建Uri实例。它解析URI,将其置于规范格式,并进行任何必需的转义编码
此构造函数不确保Uri引用可访问的资源
此构造函数假定字符串参数引用绝对URI,相当于调用UriKind设置为绝对的URI构造函数。如果传递给构造函数的字符串参数是相对URI,则此构造函数将引发UriFormatException
这将尝试从用户输入构造规范Uri。而且您有很多属性来检查和提取所需的URL部分。是否有理由在第一个
if
中使用按位OR而不是逻辑OR?有关差异的解释,请参阅。@DanielHilgarth我已更新了答案。最初的脚本是用VB.NET编写的,所以我在c#中发布了它作为OP,但错过了。感谢您的建议,看起来我可能不得不选择手动实现(至少现在是这样),但是https
部分对我来说不是问题。对于那些类型的站点,我希望用户已经明确地包含了https部分,谢谢你的建议,但是在尝试之后,它只适用于前两个示例。最后两个示例将引发异常。因此,这对我的需要不起作用,你应该尝试两种答案的组合。对于另一个答案,您满足了拥有http的必要条件。对于第二个,您将验证URL的其余部分是否正确。您可以检查用户输入以强制包含http吗?我可以强制输入一个有效的url,但仍然希望在使用之前进行检查(只是为了确保)。现在我将尝试一个自定义函数,看看它是如何使用正则表达式强制实现的。在谷歌中查找“c#regex url检查”。有很多好的样品。