2010-11-30 2 views
1

HTML/XMLを解析または操作するために正規表現を使用することは悪い考えであり、通常は行いません。しかし、代替案の欠如のためにそれを考慮する。RegexまたはXmlParserのいずれかを使用してタグに含まれていないテキストを置き換えます。

C#を使用して、タグの一部ではない文字列(理想的には特定のIDを持つスパンタグ)内のテキストを置き換える必要があります。

例えば、私は正規表現を使用してみました代替テキスト(私の場合は、別のスパン)

ABC at start of line or ABC here must be replaced but, <span id="__publishingReusableFragment" >ABC inside span must not be replaced with anything. Another ABC here </span> this ABC must also be replaced

とスパンの内側にはない以下のテキストでABCのすべてinstacesを交換したいとしましょうどちらも先を見て、主張の背後を見る。

string regexPattern = "(?<!id=\"__publishingReusableFragment\").*?" + stringToMatch + ".*?(?!span)"; 

の行に沿ったさまざまな組み合わせですが、それをあきらめました。

私はそれをXElementに読み込み、そこからライターを作成し、ノード内にテキストを入れようとしました。しかし、それを理解することはできませんでした。

XElement xel = XElement.Parse("<payload>" + inputString + @"</payload>"); 
XmlWriter requiredWriter = xel.CreateWriter(); 

私は何らかの形でノードの一部ではない文字列を取得して置き換えることを希望しています。

基本的に私はこの問題を解決するための提案/解決策に開放しています。

ご協力いただきありがとうございます。まだ

答えて

1
resultString = Regex.Replace(subjectString, 
    @"(?<!    # assert that we can't match the following 
         # before the current position: 
         # An opening span tag with specified id 
    <\s*span\s*id=""__publishingReusableFragment""\s*> 
    (?:    # if it is not followed by... 
     (?!<\s*/\s*span) # a closing span tag 
     .     # at any position between the opening tag 
    )*     # and our text 
    )     # End of lookbehind assertion 
    ABC     # Match ABC", 
    "XYZ", RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace); 

は、HTML解析に関するすべての警告で動作します動作します(あなたが知っているように見えるということなので、私はここでそれらを繰り返すことはしません)有効です。

正規表現は、先頭に「<span id=__publishingReusableFragment">」というタグがなく、そのうちに「<span>」というタグがない場合はABCと一致します。ネストされた<span>タグがあれば、明らかに失敗します。

+0

いいですね。しかし、スパンタグにいくつかの余分な属性があるのはどうでしょうか? ...正規表現のスパン部分をしかし、今度は、spanタグの最後の後に一致しません。...このABC ... – Chaitanya

+0

あなたは始めています正規表現を使ってHTMLを解析するのは良い考えではありません。属性に '>'が含まれていない場合は、 '<\s*span[^>] * id =" "__ publishingReusableFragment" "[^>] *>'を使用して、最高の状態を期待できます。 –

+0

うん、それは、ありがとう、ありがとう。うん、それは私がLinqToXMLやLinqToHtmlのlibを使って歩くことがアイデアかもしれないと思った理由です。これは、手作業による後処理を減らすために、あるデータを手掛かりにする必要がある、インポートツールから離れているだけです。 – Chaitanya

1

私はその少し醜いを知っているが、これは

var s = 
    @"ABC at start of line or ABC here must be replaced but, <span id=""__publishingReusableFragment"" >ABC inside span must not be replaced with anything. Another ABC here </span> this ABC must also be replaced"; 
var newS = string.Join("</span>",s.Split(new[] {"</span>"}, StringSplitOptions.None) 
    .Select(t => 
     { 
      var bits = t.Split(new[] {"<span"}, StringSplitOptions.None); 
      bits[0] = bits[0].Replace("ABC","DEF"); 
      return string.Join("<span", bits); 
     })); 
+0

全く醜いです。これは、実行する必要があることを実行するための素晴らしい方法です(少し醜いです)。唯一の問題は、すべてのスパンを無視することです。正規表現のように、特定のIDを持つだけではありません。これはおそらく私に合うように拡張されている可能性があり、他の多くの状況で役立つでしょう。 – Chaitanya

関連する問題