Converting URLs Into Links With Regex

4.5 (14 votes)

Following on from the recent spate of extensions methods I've posted, here's another I use to convert URLs and email addresses into links within HTML. You may want to restrict users from submitting HTML tags via forms in your application, which means that URLs and email addresses that they submit appear as plain text unless they are subjected to some kind of processing.


/// <summary>
/// Finds web and email addresses in a string and surrounds then with the appropriate HTML anchor tags 
/// </summary>
/// <param name="s"></param>
/// <returns>String</returns>
public static string WithActiveLinks(this string s)
{
  //Finds URLs with no protocol
  var urlregex = new Regex(@"\b\({0,1}(?<url>(www|ftp)\.[^ ,""\s<)]*)\b", 
    RegexOptions.IgnoreCase | RegexOptions.Compiled);
  //Finds URLs with a protocol
  var httpurlregex = new Regex(@"\b\({0,1}(?<url>[^>](http://www\.|http://|https://|ftp://)[^,""\s<)]*)\b", 
    RegexOptions.IgnoreCase | RegexOptions.Compiled);
  //Finds email addresses
  var emailregex = new Regex(@"\b(?<mail>[a-zA-Z_0-9.-]+\@[a-zA-Z_0-9.-]+\.\w+)\b", 
    RegexOptions.IgnoreCase | RegexOptions.Compiled);
  s = urlregex.Replace(s, " <a href=\"http://${url}\" target=\"_blank\">${url}</a>");
  s = httpurlregex.Replace(s, " <a href=\"${url}\" target=\"_blank\">${url}</a>");
  s = emailregex.Replace(s, "<a href=\"mailto:${mail}\">${mail}</a>");
  return s;
}

This will convert most URLs, but not all. Parsing URLs is not the easiest thing to do so you need to make a judgement on what type of URLs your users/visitors are most likely to provide and alter the regex patterns accordingly. One thing to point out is that the second pattern (the one that matches URLs with a protocol - http, https etc) also checks to make sure that it isn't already a hyperlink. By the time the second Replace() operations takes place, URLs without protocols will already be fitted with them, and have HTML surrounding them.

 

Date Posted:
Last Updated:
Posted by:
Total Views to date: 14019

1 Comment

- Tvrtko

Hello Mike,
this works great, however, part with email link will duplicate anchor tag. For http urls you did ignore existing html anchors from match correctly , but for email they get matched even if they have html anchor around already.

Recent Comments

Curt Smith 27/07/2016 20:38
In response to ASP.NET Web Pages vNext or Razor Pages
I am only slightly disappointed to hear that WebMatrix is officially dead, because I suspected this...

Darshan Raj L G 27/07/2016 13:20
In response to Implementing SQL Server Full-Text Search In An ASP.NET MVC Web Application With Entity Framework
I though it would be more helpful for somebody who wants to work with Entity Framework... please EF...

Satyabrata 25/07/2016 08:09
In response to Loading ASP.NET Core MVC Views From A Database Or Other Location
Very Interesting!!...

Jerrie Pelser 23/07/2016 05:08
In response to Loading ASP.NET Core MVC Views From A Database Or Other Location
Very cool concept Mike!...

Satyabrata 20/07/2016 20:54
In response to ASP.NET Web Pages vNext or Razor Pages
Thanks for sharing ...

infocyde 18/07/2016 00:40
In response to ASP.NET Web Pages vNext or Razor Pages
Curious to see if a new release of webmatrix will happen or if that is dead in the water....

Don 15/07/2016 16:58
In response to ASP.NET Web Pages vNext or Razor Pages
Thanks Mike! Wonder if the MVC Lite is the Controllerless Views approach referred to on the Web Dev...

Jose Negro 30/06/2016 16:02
In response to Entity Framework Code First and Stored Procedures
Thank you very much for so clear examples....

A. Truong 29/06/2016 15:25
In response to The Best Way To Import Data From Excel To SQL Server via ASP.NET
Awesome work! Lifesaver....

satyabrata 19/06/2016 18:53
In response to Entity Framework Code First and Stored Procedures
Nice article. Thanks. The menu on this website not working in mobile....