1

リッチテキストエディタを介してユーザーが入力するHTMLコンテンツがあるので、ほとんど何でもかまいません(bodyタグの外側にあるはずのないものを除いて、「head」やdoctypeなどの心配はありません)。このコンテンツの例:

<h1>Header 1</h1>
<p>Some text here</p><p>Some more text here</p>
<div align=right><a href="x">A link here</a></div><hr />
<h1>Header 2</h1>
<p>Some text here</p><p>Some more text here</p>
<div align=right><a href="x">A link here</a></div><hr />

秘訣は、テキストの最初の100文字のみを抽出する必要があることです(HTMLタグは削除されます)。また、改行を保持し、単語を分割しないようにする必要があります。

したがって、上記の出力は次のようになります。

Header 1
Some text here

Some more text here

A link here

Header 2
Some text here

Some

98文字で、改行は保持されます。これまでに達成できることは、正規表現を使用してすべてのHTMLタグを削除することです。

Regex.Replace(htmlStr, "<[^>]*>", "")

次に、正規表現を使用して長さをトリミングします。

Regex.Match(textStr, @"^.{1,100}\b").Value

私の問題は、改行をどのように保持するかです。次のような出力が得られます。

Header 1
Some text hereSome more text here
A link here
Header 2
Some text hereSome more text

結合文に気づきましたか?おそらく誰かがこの問題を解決する他の方法を教えてくれるでしょう。ありがとう!

追加情報:私の目的は、一連のHTMLコンテンツからプレーンテキストの概要を生成することです。これは、この問題を明確にするのに役立つと思います。

4

4 に答える 4

2

これを解決する方法は、単純なブラウザであるかのように見ることだと思います。基本 Tag クラスを作成し、おそらく InnerHTML プロパティと仮想メソッド PrintElement で抽象化します。

次に、気になる HTML タグごとにクラスを作成し、基本クラスから継承します。あなたの例から判断すると、最も重要なタグは h1、p、a、および hr です。InnerHTML に基づいて要素を適切に出力する文字列を返すように PrintElement メソッドを実装します (たとえば、p クラスの PrintElement は "\n[InnerHTML]\n" を返します)。

次に、HTML を解析して作成するオブジェクトを決定し、それらのオブジェクトをキューに追加するパーサーを作成します (ツリーの方が適していますが、目的には必要ないようです)。

最後に、要素ごとに PrintElement メソッドを呼び出してキューを調べます。

計画よりも多くの作業が必要になる可能性がありますが、単純に正規表現を使用するよりもはるかに堅牢なソリューションであり、将来気が変わって単純なスタイルを表示したい場合は、元に戻って PrintElement メソッドを変更するだけです。

于 2009-08-06T15:00:54.940 に答える
1

参考までに、正規表現を使用してHTMLを削除することは、微妙な問題でいっぱいです。HTML Agility Packはより堅牢かもしれませんが、それでも単語が一緒に出血するという問題があります。

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
string text = doc.DocumentNode.InnerText;
于 2009-08-06T04:14:29.883 に答える
0

1つの方法は、次の3つのステップでHTMLを削除することです。

Regex.Replace(htmlStr, "<[^/>]*>", "") // don't strip </.*>
Regex.Replace(htmlStr, "</p>", "\r\n") // all paragraph ends are replaced w/ new line
Regex.Replace(htmlStr, "<[^>]*>", "") // replace remaining </.*>
于 2009-08-06T04:26:46.923 に答える