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 を作成する方法がわかりません。
これらのリンクを作成するより良い方法や、メモリ不足の例外に対する解決策はありますか?