0

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 Exceptions を取得し始めました。

これらの投稿の助けを借りて、 htmlを直接変更する代わりに、mshtml を使用してリンクを作成することを検討しました。-59bba0651a1c . 正規表現の一致ごとに IHTMLTxtRange を作成する方法がわかりません。

これらのリンクを作成するより良い方法や、メモリ不足の例外に対する解決策はありますか?

4

1 に答える 1

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ます。

于 2013-01-30T22:57:55.827 に答える