1

我有一个电子邮件正文,它曾经是纯文本,但现在我已将其设为 HTML。这些电子邮件是使用多种方法生成的,但没有一个是容易转换的。

我所拥有的是:

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

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

有没有人有这个功能?

4

3 回答 3

2

我会使用正则表达式来找到它们。看看这个博客,Regex 在文本中查找 URL 并将它们作为链接作为一个很好的起点。

于 2010-05-26T09:04:38.890 回答
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>" );
}

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

为了找到 Urls,我们假设它们以一些协议名称开头,后跟://,同样不允许有空格。

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/,但我希望不是这样,因为那时我们将不得不使用一些更严格的正则表达式。

于 2010-05-30T11:54:32.967 回答
1

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

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

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

例如,如果已经存在的文本是实际的 URL,那么您可以使用

    email = email.Replace(match.Value, "<a href=" + match.Value + ">" + 
       HttpUtils.UrlEncode(match.Value.Substring(1,match.Value.Length-2)) + "</a>");
于 2010-05-29T06:49:57.777 回答