パーサーを使用してHtmlAgilityPackのようなHTMLを解析し、正規表現を使用color
して属性の値を検索します。
まず、xpathを使用して、定義されたstyle
属性を含むすべてのノードを見つけます。color
var doc = new HtmlDocument();
doc.LoadHtml(html);
var nodes = doc.DocumentNode
.SelectNodes("//*[contains(@style, 'color')]")
.ToArray();
次に、色の値に一致する最も単純な正規表現:(?<=color:\s*)#?\w+
。
var colorRegex = new Regex(@"(?<=color:\s*)#?\w+", RegexOptions.IgnoreCase);
次に、これらのノードを反復処理し、正規表現が一致する場合は、ノードの内部htmlをhtmlエンコードされたタグに置き換えます(理由は少し後でわかります)。
foreach (var node in nodes)
{
var style = node.Attributes["style"].Value;
if (colorRegex.IsMatch(style))
{
var color = colorRegex.Match(style).Value;
node.InnerHtml =
HttpUtility.HtmlEncode("<" + color + ">") +
node.InnerHtml +
HttpUtility.HtmlEncode("</" + color + ">");
}
}
そして最後に、ドキュメントの内部テキストを取得し、その上でhtmlデコードを実行します(これは、内部テキストがすべてのタグを削除するためです)。
var txt = HttpUtility.HtmlDecode(doc.DocumentNode.InnerText);
これは次のようなものを返すはずです:
This is a sample html text.
<#ff9999>this is only a sample</#ff9999>
....
and some other tags...
もちろん、ニーズに合わせて改善することもできます。