0

Html コードをプレーン テキストに変換したいが、色付きのテキスト タグのみを保持したい。例: 以下の Html がある場合:

<body>

This is a <b>sample</b> html text.
<p align="center" style="color:#ff9999">this is only a sample<p>
....
and some other tags...
</body>
</html>

私は出力が欲しい:

this is a sample html text.
<#ff9999>this is only a sample<>
....
and some other tags...
4

2 に答える 2

1

パーサーを使用して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...

もちろん、ニーズに合わせて改善することもできます。

于 2012-04-18T14:02:59.197 に答える
1

正規表現を使用してそれを行うことは可能ですが... 正規表現で(X)HTML を解析しないでください。

問題を解決するために最初に使用した正規表現は次のとおりです。

<p(\w|\s|[="])+color:(#([0-9a-f]{6}|[0-9a-f]{3}))">(\w|\s)+</p>

グループ 5 は 16 進数 (3 または 6 の 16 進数) の色になり、グループ 6 はタグ内のテキストになります。

明らかに、私は正規表現の達人ではないので、これは最善の解決策ではありません。明らかに、いくつかのテストとおそらく一般化が必要です...しかし、それでも始めるには良いポイントです。

于 2012-04-18T08:27:32.587 に答える