用封闭的HREFS替换电子邮件和HREFS

时间:2010-05-26 07:24:04

标签: c# email html-email

我有一个曾经是纯文本的电子邮件正文,但现在我已经把它变成了HTML。电子邮件是使用多种方法生成的,并且没有一种方法易于转换。

我拥有的是:

Some content emailaddress@something.com, some http://www.somewebsite/someurl.aspx.

我想要做的是创建一个功能,自动将HREF标记中的所有电子邮件地址和所有网址都包含在字符串中,以便HTML电子邮件在所有电子邮件客户端中正确读取。

有没有人有这个功能?

3 个答案:

答案 0 :(得分:2)

我会使用正则表达式来查找它们。看一下这个博客,Regex to find URL within text and make them as link是一个很好的起点。

答案 1 :(得分:2)

我们需要一些正则表达式魔法。首先我们找到电子邮件。我希望我们不需要验证它们,所以任何没有空格的单词都跟着@。没关系。

public static string MakeEmailsClickable( string input ){
  if (string.IsNullOrEmpty(input) ) return input;
  Regex emailFinder = new Regex(@"[^\s]+@[^\s\.]+.[^\s]+", RegexOptions.IgnoreCase);
  return emailFinder.Replace(input, "<a href=\"mailto:$&\">$&</a>" );
}

$& - 表示正则表达式中的当前匹配。

要查找网址,我们假设他们以某个协议名称开头,后跟://,再次不允许空格。

public static string MakeUrlsClickable( string input ){
  if (string.IsNullOrEmpty(input) ) return input;
  Regex urlFinder = new Regex(@"(ftp|http(s)?)://[^\s]*", RegexOptions.IgnoreCase);
  return urlFinder.Replace(input, "<a href=\"$&\">$&</a>" );
}

这个查找ftp,http或https链接,但您可以将任何协议添加到正则表达式中,将其与|(管道)分开,如下所示:(file|telnet|ftp|http(s)?)://[^\s]*)

实际上URL中也可能包含@ http://username:password@host:port/,但我希望情况并非如此,因为我们将不得不使用更严格的正则表达式。

答案 2 :(得分:1)

您说要包含字符串中的所有电子邮件和网址 - 您的意思是引用?如果是这样,那么这样的事情就可以了。它识别电子邮件和网址。因为我们假设字符串设置了电子邮件地址/网址的长度,那么正则表达式是故意松散的 - 试图在这里过于具体可能意味着某些连字案例不匹配。

public string LinkQuotedEmailsAndURLs(string email)
{
    Regex toMatch = new Regex("((https?|ftp)?://([\\w+?\\.\\w+])+[^ \"]*)|\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*", RegexOptions.IgnoreCase);

    MatchCollection mactches = toMatch.Matches(email);

    foreach (Match match in mactches) {
        email = email.Replace(match.Value, "<a href=" + match.Value + ">" + match.Value.Substring(1,match.Value.Length-2) + "</a>");
    }

    return email;
}

目前尚不清楚原始文本是否包含实际的网址编码网址或“可呈现的”网址解码形式。您可能希望在匹配值上使用HttpUtils.UrlEncode / UrlDecode以确保嵌入的href已编码,而呈现的字符串已解码,因此href包含“%20”,但这些在链接文本中显示为常规字符。

E.g。如果已存在的文本是实际的URL,则可以使用

    email = email.Replace(match.Value, "<a href=" + match.Value + ">" + 
       HttpUtils.UrlEncode(match.Value.Substring(1,match.Value.Length-2)) + "</a>");