最近,我有一个情况下,一个ASP.NET页面中显示用户在侧栏的URL。这工作得很好,我发现一些用户有很长的URL,这不看的权利的除外。
发生,我认为我可以简单的截断可见网址,同时仍然保持相同的基础链接。然而,当我被截断修剪多余的字符的URL的,我意识到它可以做得更加智能化。
例如,考虑的URL http://www.domain.com/here/is/one/long/url/page.apsx。如果我想保持它在40个字符,我可以修剪http://www.domain.com/here/is/one/long/u。问题是,这个缩写可以提供更多的信息。例如,它是一个目录或网页?而且,如果它的一个页面,什么样的? "; uquot;结束主张究竟是什么?
,那岂不是更好一点,如果我,而不是缩写URL到http://www.domain.com/.../url/page.apsx?我们已经失去了应有的三个点,显示信息丢失的几个字符。但我们仍然可以看到域,页面的名称和类型。
代码清单1 abbreviates的URL是这样。 UrlHelper类包含只是一个单一的,静态的方法,LimitLength()。此方法需要一个URL字符串,最大长度参数,并试图缩写URL,使其适合在指定的字符数,如上所述。
清单1:UrlHelper类public class UrlHelper
{
public static char[] Delimiters = { '/', '\\' };
/// <summary>
/// Attempts to intelligently short the length of a URL. No attempt is
/// made to shorten less than 5 characters.
/// </summary>
/// <param name="url">The URL to be tested</param>
/// <param name="maxLength">The maximum length of the result string</param>
/// <returns></returns>
public static string LimitLength(string url, int maxLength)
{
if (maxLength < 5)
maxLength = 5;
if (url.Length > maxLength)
{
// Remove protocol
int i = url.IndexOfAny(new char[] { ':', '.' });
if (i >= 0 && url[i] == ':')
url = url.Remove(0, i + 1);
// Remove leading delimiters
i = 0;
while (url.Length > 0 && (url[i] == Delimiters[0]
|| url[0] == Delimiters[1]))
i++;
if (i > 0)
url = url.Remove(0, i);
// Remove trailing delimiter
if (url.Length > maxLength && (url.EndsWith("/") || url.EndsWith("\\")))
url = url.Remove(url.Length - 1);
// Remove path segments until url is short enough or no more segments:
//
// domain.com/abc/def/ghi/jkl.htm
// domain.com/.../def/ghi/jkl.htm
// domain.com/.../ghi/jkl.htm
// domain.com/.../jkl.htm
if (url.Length > maxLength)
{
i = url.IndexOfAny(Delimiters);
if (i >= 0)
{
string first = url.Substring(0, i + 1);
string last = url.Substring(i);
bool trimmed = false;
do
{
i = last.IndexOfAny(Delimiters, 1);
if (i < 0 || i >= (last.Length - 1))
break;
last = last.Substring(i);
trimmed = true;
} while ((first.Length + 3 + last.Length) > maxLength);
if (trimmed)
url = String.Format("{0}...{1}", first, last);
}
}
}
return url;
}
}