2009-06-06 6 views
1

ない場合、私は HTMLページに置き換えるべき単語のリストを持っているが、言葉は(ABIのような)タグのリスト内にない場合にのみがあれば、それは内部にある特定のHTMLタグ

をテキストが置き換えXXXは、制限されたタグのリスト内でなかった場合にのみ、XXXを置き換え

<p> some text and YYY term <a href="http://some-XXX-bla.com">good morning XXX world</a> other text and YYY term <b>another XXX inside other sentance</b> </p> 

YYY:

<p> some text and XXX term <a href="http://some-XXX-bla.com">good morning XXX world</a> other text and XXX term <b>another XXX inside other sentance</b> </p> 

とXXXは、最終的なテキストがあるべきよりもYYYに交換する必要があります。テキストです(A、I、B)

は、C#の正規表現で何とか行われるべきで助けを

どうもありがとう:)

答えて

2

MatchEvaluatorを使用できます。考えられるのはのいずれかのタイプの完全な要素であるまたはのターゲット文字列と一致するということです。完全な要素にマッチした場合は、プラグインし直すだけです。ターゲット文字列が含まれているかどうかは気にしません。それ以外の場合は、置換テキストを挿入します。

public string GetReplacement(Match m) { 
    return m.Groups[1].Success ? m.Groups[1].Value : "YYY"; 
} 

Regex r = new Regex(@"(?is)(<([abi]\b)[^<>]*>.*?</\2>)|XXX"); 
string newString = r.Replace(oldString, 
        new MatchEvaluator(GetReplacement)); 

ただし、有効な(X)HTMLでもこのコードが失敗する多くの状況があることに注意してください。コメントの内側

<i>blah <i>blah</i> XXX</i> 

または、開始または終了タグあなたをつまずかせることができます::

<b>blah <!-- </b> --> XXX</b> 
あなたが扱うことができる

例えば、要素は次のように、同じ種類の別の要素内にネストすることができ正規表現とMatchEvaluatorコードをより複雑にすることによって潜在的な問題の多くを解決しますが、最終的にはいくつかの欠陥を受け入れるか、Noldorinが推奨するような専用のHTMLパーサーに切り替える必要があります。

6

これは何度も言われていますが、私はここにもそれを繰り返すことがあり..あなたは本当に正規表現をHTML解析に使用したくない。単にHTMLの複雑さには合っていません(lotは、最初に見えるよりも正規表現を解析するのが難しいです)。

.NETの最良の選択肢は、HTML Agility Packです。これは、どんな形式のHTML「スープ」も正しく解析できる非常に堅牢なライブラリです。また、DOM構造を公開するため、操作が非常に簡単です。これにより、単純にDOMをトラバースし、親要素/祖先ノードを簡単にチェックできるため、適切な要素のInnerTextプロパティを変更することで置換を実行できます。すべての作業が完了したら、変更されたDOMオブジェクトから生のHTMLを出力するという簡単な呼び出しです。

+0

私は同意します - 解析のためのregexpの使用法は魅力的ではありません。しかし、ここでは、テキストファイルのテキストを置き換えるために必要なものがあります。私はHTML Agility Packを見て、HTMLの解析と変換では非常に面白かったが、テキスト置換ではそれほど興味がなかった。 – Zelid

+1

ああ、実際のテキストを置き換える場合は、element.InnerTextプロパティの値を変更するだけです。これはおそらく 'string.Rpleace'で取り除くことができます。本当に必要な場合は、HTMLアジリティパックと一緒にregexを使用してください。 (私があなたに誤解した場合は、私を訂正してください。) – Noldorin

関連する問題