2010-05-26 4 views
1

У меня есть тело электронной почты, которое раньше было простым текстом, но теперь я сделал его HTML. Письма создаются с использованием ряда методов, и ни один из них не может быть легко преобразован.Замените электронные письма и HREFS с включенным HREFS

Что у меня есть:

Some content [email protected], some http://www.somewebsite/someurl.aspx. 

То, что я хотел бы сделать, это создать функцию, которая автоматически охватывающую все адреса электронной почты и все URL-адрес в пределах строк в HREF тэгов так, что HTML электронной почта читает правильно во всех почтовых клиентах.

У кого-нибудь есть функция для этого?

ответ

2

Нам нужно немного волшебства регулярного выражения. Сначала мы находим электронные письма. Надеюсь, нам не нужно проверять их, поэтому любое слово без пробелов с @ следует за ним. это нормально.

public static string MakeEmailsClickable(string input){ 
    if (string.IsNullOrEmpty(input)) return input; 
    Regex emailFinder = new Regex(@"[^\s][email protected][^\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:[email protected]:port/, но я надеюсь, что это не так, так как тогда нам придется использовать более строгие регулярные выражения.

1

Вы говорите, что хотите вложить всю электронную почту и URL-адреса, которые находятся внутри строки - вы имеете в виду цитату? Если так, то что-то подобное сделает трюк. Он распознает электронные письма и 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», но они отображаются как обычные символы в тексте ссылки.

E.g. если текст уже присутствует, это действительный URL-адрес, вы можете использовать

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

 Смежные вопросы

  • Нет связанных вопросов^_^