添加指向WebBrowser控件的InnerText的链接

时间:2013-01-30 22:26:14

标签: c# webbrowser-control mshtml

我正在WebBrowser控件中显示传入的电子邮件。如果电子邮件是HTML格式的,则可以单击链接,用户可以在默认浏览器中快速导航到URL。但是,如果电子邮件是纯文本格式,我只需将WebBrowser的InnerText设置为等于电子邮件的文本。

这给我留下了没有锚标记的网址,用户必须将网址复制并粘贴到他们的浏览器中。

我的第一直觉就是将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 Exceptions消失。

我研究了使用mshtml创建链接,而不是直接通过这些帖子http://social.msdn.microsoft.com/Forums/da-DK/csharpgeneral/thread/1d050260-3625-42cc-94ec-59bba0651a1c的帮助来更改html。我还不确定如何在每个正则表达式匹配上创建IHTMLTxtRange。

有没有更好的方法来创建这些链接或内存不足异常的解决方案?

1 个答案:

答案 0 :(得分:0)

这对你有用吗?

public static string CheckPlainTextLinks(string html) {
    var regx=new Regex(@"((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*)", RegexOptions.IgnoreCase);
    return regx.Replace(html, x => "<a href='"+x.Value+"'>"+x.Value+"</a>").Replace(Environment.NewLine, "<br />");
}

不是在foreach循环中重复替换,而是与MatchEvaluator一起使用。