2

私は特殊な HTML ストリッパーに取り組んでいます。現在のストリッパーは <td> タグをタブに置き換え、次に <p> および <div> タグを二重の改行に置き換えます。ただし、次のようにコードを削除する場合:

<td>First Text</td><td style="background:#330000"><p style="color:#660000;text-align:center">Some Text</p></td>

それは(明らかに)生成します

First Text

Some Text

この場合、 <p> を何も置き換えないようにしたいので、次のようになります。

First Text (tab) Some Text

ただし、 <p> タグが <td> タグで囲まれていない他のコードでは、ダブル キャリッジ リターンの置換を維持したいと考えています。

基本的に、 <td> タグは常に \t に置き換え、 <p> および <div> タグは <td> タグで囲まれていない場合のみ \r\r に置き換えようとしています。

現在のコード: (C#)

  // insert tabs in places of <TD> tags
  result = System.Text.RegularExpressions.Regex.Replace(result,
           @"<td\b(?:[^>""']|""[^""]*""|'[^']*')*>", "\t",
           System.Text.RegularExpressions.RegexOptions.IgnoreCase);  

  // insert line paragraphs (double line breaks) in place
  // of <P>, <DIV> and <TR> tags
  result = System.Text.RegularExpressions.Regex.Replace(result,
           @"<(div|tr|p)\b(?:[^>""']|""[^""]*""|'[^']*')*>", "\r\r",
           System.Text.RegularExpressions.RegexOptions.IgnoreCase);

(ストリッパーにはさらにコードがあります。これは関連する部分です)

ストリッパー全体を完全に書き直さずにこれを行う方法についてのアイデアはありますか?

編集:法的な問題は言うまでもなく、ライブラリをサインオフしてプロジェクトに含めるという頭痛の種のため、ライブラリを使用しないことをお勧めします(それ自体は別のプロジェクトに含まれるライブラリです)。他に解決策がない場合は、おそらく HTML Agility Pack を使用します。

ほとんどの場合、ストリッパーはタグのように見えるものをすべて取り除きます (Regular Expressions Cookbook の正規表現に基づく大きな正規表現で行われます。これは、改行タグを /r に置き換え、複数のタブを処理することです。カスタム ストリップ コード。

4

4 に答える 4

2

答えを見つけました:

  // remove p/div/tr inside of td's
  result = System.Text.RegularExpressions.Regex.Replace(result, @"<td\b(?:[^>""']|""[^""]*""|'[^']*')*>.*?</td\b(?:[^>""']|""[^""]*""|'[^']*')*>", new MatchEvaluator(RemoveTagsWithinTD));

このコードは、一致ごとにこの個別のメソッドを呼び出します。

  //a separate method
  private static string RemoveTagsWithinTD(Match matchResult) {
      return Regex.Replace(matchResult.Value, @"<(div|tr|p)\b(?:[^>""']|""[^""]*""|'[^']*')*>", "");
    }

このコードは、(再び)正規表現クックブックの別のレシピに基づいています(これはずっと私の目の前にありました!)。本当に素晴らしい本です。

于 2009-07-30T16:37:13.430 に答える
2

タグを操作するための多くの解析オプションが組み込まれているHTML Agility Packを検討することを考えましたか?

于 2009-07-23T17:50:18.717 に答える
0

アジリティパックを使用できない場合。ブロックの存在をチェックする単純な一致を作成した場合はどうなるでしょうか。存在する場合は、ブロック内のタグのすべての適切な置換を行うことができます。そうでない場合は、ブロック内にないタグに対して機能する 2 番目の置換セットがあります。

既存の置換を書き直す必要はなく、他の条件用にもう 1 つ単純なものを作成するだけです。これは、HTML ストリッピングの 1 つの「単位」で解析されるテキストの量に依存すると思います。

于 2009-07-23T21:22:15.777 に答える
0

正規表現で書く限り答えはありませんが、このようなものにはHTML Agility Packを強くお勧めします。シンプルなセレクターでノードを簡単に見つけて、必要なものに置き換えるだけです。

于 2009-07-23T17:52:15.483 に答える