2012-05-28 109 views
2

在我的代碼中,我找到了所有匹配元素並用特殊值替換它。如何正確替換字符串

Regex imgRule = new Regex("img id=\\\".+?\\\""); 
        MatchCollection matches = imgRule.Matches(content.Value); 
        string result = null; 
        foreach (Match match in matches) 
         result = match.Value; 

        if (result != null) 
        { 
         var firstOrDefault = node.ListImages.FirstOrDefault(); 
         if (firstOrDefault != null) 
         { 
          var htmlWithImages = content.Value.Replace(result, string.Format("img src='{0}' class='newsimage' width='300'", firstOrDefault.ImageUrlId)); 
          node.Content = htmlWithImages; 
         } 
        } 

但是,我的代碼是錯誤的,因爲如果有不止一個匹配它僅替換最後一個,我怎麼能糾正我的替換所有匹配文本代碼?

+0

什麼是'content'類型?它在哪裏宣佈?節點的類型是什麼?它在哪裏宣佈? –

回答

3

你是丟失for循環體的花括號。如果沒有花括號,多次執行的唯一行是第一行。

試試這個:

foreach (Match match in matches) 
{         // added curly brace here 
    result = match.Value; 

    if (result != null) 
    { 
     var firstOrDefault = node.ListImages.FirstOrDefault(); 
     if (firstOrDefault != null) 
     { 
      var htmlWithImages = content.Value.Replace(result, 
       string.Format("img src='{0}' class='newsimage' width='300'", 
           firstOrDefault.ImageUrlId)); 
      node.Content = htmlWithImages; 
     } 
    } 
}         // added curly brace here 

我也想進一步補充兩點:

  • 有一個名爲Regex.Replace方法,您可以使用,而不是先找到你想要的字符串使用正則表達式替換,然後使用string.Replace
  • 如果您嘗試解析HTML,最好使用HTML解析器。看看HTML Agility Pack,看看它是否可以更簡單地解決您的問題。
+0

謝謝,無論如何主要的問題是:在第一次我替換content.Value第一次匹配和然後我替換content.Value第二次匹配,並且第一次替換不保存 – revolutionkpi

+0

@revolutionkpi:關於您的代碼的一個奇怪的事情是您正在從'content.Value'中讀取並指定給'node.Content'。你確定當你賦值給'node.Content'時,這些改變在'content.Value'中是可見的嗎?我認爲從文檔中讀取內容並轉換爲純字符串會更有意義,可以對字符串進行所需的替換('s = s.Replace(...);'),然後重新分配最終結果到最後的文檔(不在循環中)。但是你真的應該使用HTML敏捷包來處理這類事情。它會讓你的生活更輕鬆。 –

+1

@revolutionkpi:順便說一下,我的回答實際上是針對你的「主要」問題。如果您認爲我的回答沒有回答您的問題,那麼我認爲您可能會誤讀或誤解了我的答案。您的代碼中還可能沒有*一個*,但是*多個*錯誤。那麼我建議你一個接一個地修復它們,並且不要氣餒,修復一個錯誤並不能立即解決你所有的問題。有時你需要採取很多小步驟才能到達最終目的地。 –

1

我想你可能會缺少一組圍繞你的循環括號...

只有這條線被循環。這就是爲什麼你的代碼只更新中的最後一項,作爲結果被設置到最後一個項目集合中(關於在foreach的最後一次迭代)

  foreach (Match match in matches) 
         result = match.Value; 

更正代碼

Regex imgRule = new Regex("img id=\\\".+?\\\""); 
         MatchCollection matches = imgRule.Matches(content.Value); 
         string result = null; 
         foreach (Match match in matches) { 
          result = match.Value; 

          if (result != null) 
          { 
           var firstOrDefault = node.ListImages.FirstOrDefault(); 
           if (firstOrDefault != null) 
           { 
            var htmlWithImages = content.Value.Replace(result, string.Format("img src='{0}' class='newsimage' width='300'", firstOrDefault.ImageUrlId)); 
            node.Content = htmlWithImages; 
           } 
          } 
         } 
+0

謝謝,但是當我用第二個匹配替換字符串時,第一個是沒有保存,所以在結果中只有最後一個替換 – revolutionkpi

1
 
foreach (Match match in matches) 
{ 
    result = match.Value; 

    if (result != null) 
    { 
     var firstOrDefault = node.ListImages.FirstOrDefault(); 
     if (firstOrDefault != null) 
     { 
      var htmlWithImages = content.Value.Replace(result, string.Format("img src='{0}' class='newsimage' width='300'", firstOrDefault.ImageUrlId)); 
      node.Content = htmlWithImages; 
     } 
    } 
}