2012-04-18 49 views
3

首先,这看起来应该是以前应该问过的,但是我找不到任何回答我的问题的东西。将网址转换为有效的href值

我的任务的基本概述是在基于用户定义的Web地址的网页上呈现锚链接。正如用户定义的地址,这可能是任何格式,例如:

我需要什么与此值做的是将其设置为锚标记的href属性。现在,问题在于(至少在Chrome中)只有前两个示例会起作用,因为它们被识别为绝对URL路径。最后两个例子将重定向到相同的域(即作为相对路径)

所以最终的问题是:什么是格式化这些值以确保一致的绝对路径的最佳方式是什么?我可以检查http/https并添加它如果失踪,但我希望有可能是一个开箱即用的.Net类,这将是更可靠。

此外,由于这是一个用户定义的值,因此它可能是完整的垃圾,因此验证URL的函数也是一个不错的奖励。

回答

1

几个月前我们遇到了这个问题,需要一致的方法来确保URL是绝对的。我们还希望通过删除http(s)://来显示网页上的网址。

我想出了这个功能:

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://,但对于某些网址,您需要https://。如果微软要在框架中构建这样的东西,那么从一开始就会出现问题。

+0

是否有理由在第一个“if”中使用按位OR而不是逻辑OR?看到[这个答案](http://stackoverflow.com/questions/7331686/why-and-not/7331721#7331721)的差异的解释。 – 2012-04-18 10:16:05

+0

@DanielHilgarth我已经更新了答案。原来的脚本是用VB.NET编写的,所以我已经把它发布到了OP的c#中,但是错过了。 – Curt 2012-04-18 10:17:28

+0

感谢您的建议,看起来我可能不得不选择手动实现(至少现在),但'https'部分对我来说不是问题。对于那些类型的网站,我希望用户明确包含https部分 – musefan 2012-04-18 10:30:01

0

您可以尝试使用Uri类此重载:

Uri Constructor (String)

这个构造函数从URI字符串创建Uri实例。它解析URI,将其置于规范格式,并进行所需的转义编码。

此构造函数不确保Uri引用可访问的资源。

此构造函数假定字符串参数引用绝对URI并等同于将UriKind设置为Absolute调用Uri构造函数。如果传递给构造函数的字符串参数是相对URI,则此构造函数将引发UriFormatException。

这将尝试从用户输入中构建一个规范的Uri。而且你有很多属性可以检查并提取你需要的URL部分。

+0

感谢您的建议,但尝试后,它只适用于前两个示例。最后两个例子引发了一个例外。所以这不适合我的需求 – musefan 2012-04-18 10:28:09

+0

然后你应该尝试两种答案的组合。与另一个答案,你满足了有http的必要条件。第二,你确认URL的其余部分是否正确。你能检查用户输入以强制包含http(s)吗? – JotaBe 2012-04-18 10:36:19

+0

我可以强制输入一个有效的网址,但是仍然要在使用之前进行检查(只是为了确保)。我现在会尝试一个自定义函数,看看它是如何去的 – musefan 2012-04-18 10:41:19