public static string HtmlToText(string htmlBody, string mailHeader)
{
string codeName; // 文字コード名
string bodyCodeName; // HTMLの文字コード名
// メールヘッダの文字コードを取得する
codeName = ParseEncoding(mailHeader);
// metaタグから正規表現で文字コードを取り出す
Regex regEnc = new Regex("<meta.*?charset=(?<encode>.*?)\".*?>", RegexOptions.IgnoreCase | RegexOptions.Singleline);
// regEncにマッチする文字列を検索
Match m = regEnc.Match(htmlBody);
// HTML本文の中でcharset=文字コード名がマッチしたとき
if(m.Success == true){
// HTMLの文字コード名を取得する
bodyCodeName = m.Groups["encode"].Value;
// メールヘッダの文字コードとHTMLの文字コードが同じとき
if(codeName.ToLower() == bodyCodeName.ToLower()){
// HTMLの文字コードで変換する
Byte[] b = Encoding.GetEncoding(bodyCodeName).GetBytes(htmlBody);
htmlBody = Encoding.GetEncoding(bodyCodeName).GetString(b);
}
else{
// 文字コードが異なる場合はメールヘッダの文字コードで変換する
Byte[] b = Encoding.GetEncoding(codeName).GetBytes(htmlBody);
htmlBody = Encoding.GetEncoding(codeName).GetString(b);
}
}
else{
// htmlBody内にcharset指定が存在しないときは
// メールヘッダの文字コードで変換する
Byte[] b = Encoding.GetEncoding(codeName).GetBytes(htmlBody);
htmlBody = Encoding.GetEncoding(codeName).GetString(b);
}
// 正規表現の設定(<script>, <noscript>)
Regex re1 = new Regex("<(no)?script.*?script>", RegexOptions.IgnoreCase | RegexOptions.Singleline);
// 正規表現の設定(<style>)
Regex re2 = new Regex("<style.*?style>", RegexOptions.IgnoreCase | RegexOptions.Singleline);
// 正規表現の設定(すべてのタグ)
Regex re3 = new Regex("<.*?>", RegexOptions.Singleline);
// タグを取り除く
htmlBody = re1.Replace(htmlBody, "");
htmlBody = re2.Replace(htmlBody, "");
htmlBody = re3.Replace(htmlBody, "");
// 変換できなかった特殊文字を個別置換
htmlBody = htmlBody.Replace(" ", " ");
htmlBody = htmlBody.Replace("­", " ");
htmlBody = htmlBody.Replace("<", "<");
htmlBody = htmlBody.Replace(">", ">");
htmlBody = htmlBody.Replace("&", "&");
htmlBody = htmlBody.Replace(""", "\"");
htmlBody = htmlBody.Replace("©", "(c)");
htmlBody = htmlBody.Replace("®", "(R)");
htmlBody = htmlBody.Replace("™", "TM");
htmlBody = htmlBody.Replace("\r\n\r\n\r\n\r\n", "");
return htmlBody;
}