我在 WebBrowser 控件中显示传入的电子邮件。如果电子邮件采用 HTML 格式,则链接是可点击的,用户可以在默认浏览器中快速导航到 URL。但是,如果电子邮件是纯文本的,我只是将 WebBrowser 的 InnerText 设置为等于电子邮件的文本。
这给我留下了没有锚标记的 URL,用户必须将 URL 复制并粘贴到他们的浏览器中。
我的第一直觉只是将 InnerHTML 设置为电子邮件文本,使用正则表达式查找任何 URL,并将匹配项替换为相同的内容,但使用锚标记。
这提出了删除所有换行符的问题,所以我只是用适当的标签替换了这些换行符。
public static string CheckPlainTextLinks(string html)
{
Regex regx = new Regex(@"((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*)", RegexOptions.IgnoreCase);
MatchCollection mactches = regx.Matches(html);
foreach (Match match in mactches)
{
html = html.Replace(match.Value, "<a href='" + match.Value + "'>" + match.Value + "</a>");
}
html = html.Replace(Environment.NewLine, "<br />");
return html;
}
这是我扫描文本和添加链接的全部功能。然后,我将 webBrowser 控件的 InnerHTML 设置为此函数返回的内容。不幸的是,当我对该函数的调用被取消时,程序开始出现 OutOfMemory 异常。
我研究了使用 mshtml 创建链接,而不是在这些帖子的帮助下直接更改 html,http: //social.msdn.microsoft.com/Forums/da-DK/csharpgeneral/thread/1d050260-3625-42cc-94ec -59bba0651a1c。我只是不确定如何在每个正则表达式匹配上创建 IHTMLTxtRange。
有没有更好的方法来创建这些链接或内存不足异常的解决方案?