【问题标题】:Add link to InnerText of WebBrowser control添加链接到 WebBrowser 控件的 InnerText
【发布时间】:2013-01-31 06:57:55
【问题描述】:

我在 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 创建链接,而不是在这些帖子 http://social.msdn.microsoft.com/Forums/da-DK/csharpgeneral/thread/1d050260-3625-42cc-94ec-59bba0651a1c 的帮助下直接更改 html。我只是不确定如何在每个正则表达式匹配上创建 IHTMLTxtRange。

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

【问题讨论】:

  • 纯文本有多大?特别是当您遇到内存不足异常时?
  • 好像他把整页当作一个字符串。
  • 电子邮件确实包含所有以前的回复,因此它可能会变得相当大。我想说一个非常典型的链以大约 10,000 个字符结尾。
  • 我怀疑它们是长字符串;对于每个匹配和替换,都会创建一个字符串的副本;请参阅blogs.msdn.com/b/ravi_kumar/archive/2008/03/22/… 了解更多信息。此外,您可能更幸运的是只需扫描文本,手动查找 URL。在此处查看@JeffAtwood 的帖子(以及第一条评论)codinghorror.com/blog/2008/10/the-problem-with-urls.html

标签: c# webbrowser-control mshtml


【解决方案1】:

这对你更有效吗?

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 />");
}

这与MatchEvaluator 一起工作,而不是在foreach 循环中重复替换。

【讨论】:

  • 我把它放进去,并一直在测试以确保在过去的几周里我没有遇到任何内存不足的异常。完美运行,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多