Login


Abbreviating URLs

By Jonathan Wood on 12/1/2010 (Updated on 12/12/2010)
Language: C#
Technology: .NET
Platform: Windows
License: CPOL
Views: 11,992
General Programming » Text Handling » HTML & URLs » Abbreviating URLs

Abbreviate URLs Screenshot

Download Source Code Download Source Code

Introduction

Recently, I had a case where an ASP.NET page displayed the user's website address in a side column. This worked fine except that some users had very long URLs, which were too wide for the column.

Thinking about it, I decided I wanted to simply truncate the visible URL, while still keeping the underlying link intact. However, when I truncated the URL by trimming excess characters, I realized it could be done more intelligently.

For example, consider the URL http://www.domain.com/here/is/one/long/url/page.apsx. If I wanted to keep it within 40 characters, I could trim it to http://www.domain.com/here/is/one/long/u. The problem is that this abbreviation could be more informative. For example, is it a directory or a page? And, if it's a page, what kind? And what exactly does the "u" at the end stand for?

Wouldn't it be a little better if I instead abbreviated this URL to http://www.domain.com/.../url/page.aspx? We've lost a few character places from the three dots used to indicate that information is missing. But we can still see the domain, and the page name and type.

A Smart Function to Abbreviate a URL

The code in Listing 1 abbreviates a URL is this way. The UrlHelper class contains just a single, static method, LimitLength(). This method takes a URL string and maximum length arguments, and attempts to abbreviate the URL so that it will fit within the specified number of characters as described above.

Listing 1: UrlHelper class

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;
  }
}

If the specified maximum length is less than five, LimitLength() simply changes it to five as there is no point in attempting to shorten a URL to less than the length of the protocol (http://).

Conclusion

That's all there is to it. I hope some of you find this code helpful.

End-User License

Use of this article and any related source code or other files is governed by the terms and conditions of The Code Project Open License.

Author Information

Jonathan Wood

I'm a software/website developer working out of the greater Salt Lake City area in Utah. I've developed many websites including Black Belt Coder, Insider Articles, and others.