2011-11-14 41 views
2

背景信息消毒特定HTML的算法: 我有大段文字,我經常在一個字符串從封裝(使用LINQ)的XML文檔。該字符串包含許多HTML,我需要爲輸出目的而保留這些HTML,但需要刪除此字符串中偶爾出現的電子郵件和離散HTML鏈接。違規文本的例子是這樣的:使用LINQ或C#從字符串

--<a href="mailto:[email protected]" target="_blank">John Smith</a> from <a href="http://www.agenericwebsite.com" target="_blank">Romanesque Architecture</a></p> 

我需要能夠做的是:

  1. 查找以下字符串:<a href
  2. 刪除該字符串和所有字符以下這通過串>
  3. 此外,隨時刪除此字符串</a>

有沒有辦法用LINQ,我可以輕鬆地做到這一點,或者我將不得不創建一個使用.NET字符串操作來實現這一目標的算法?

+2

HTML敏捷性包 –

+1

你爲什麼要使用LINQ?這看起來像正則表達式/字符串操作將更簡單 –

+0

+1 @AustinSalonen關於處理html的任何問題的唯一答案! Html和正則表達式是一個等待發生的事故。我喜歡正則表達式:) – Goran

回答

2

你可能可以用LINQ做到這一點,但聽起來像一個普通的老REGEX會好得多,好多了。

聽起來像this question,特別是this answer表明你正在嘗試做什麼。

+0

啊,正則表達式。我很害怕。不幸的是,我從未使用它,但現在是學習的好時機。現在,我明白正則表達式可以幫助識別字符串中的子字符串和模式,但是如果我在所提供的鏈接中應用這些技術,我將如何解決大多數電子郵件和HTML鏈接的結尾分隔符爲>,其中經常出現在我的文本的其他地方?感謝您的幫助。 –

+0

@Robert - 謝謝。 –

+0

@full - 不知道我明白。你不能用答案中的技巧搜索以

1

如果你想要的是通過LinqToXml要做到這一點,嘗試這樣的遞歸函數:

static void ReplaceNodesWithContent(XElement element, string targetElementname) 
    { 
     if (element.Name == targetElementname) 
     { 
      element.ReplaceWith(element.Value); 
      return; 
     } 

     foreach (var child in element.Elements()) 
     { 
      ReplaceNodesWithContent(child, targetElementname); 
     } 
    } 

用例:

static void Main(string[] args) 
    { 
     string xml = @"<root> 
<items> 
    <item> 
     <a>inner</a> 
    </item> 
    <item> 
     <subitem> 
      <a>another one</a> 
     </subitem> 
    </item> 
</items> 

「;

 XElement x = XElement.Parse(xml); 

     ReplaceNodesWithContent(x, "a"); 

     string res = x.ToString(); 
     //   res == @"<root> 
     //      <items> 
     //      <item>inner</item> 
     //      <item> 
     //       <subitem>another one</subitem> 
     //      </item> 
     //      </items> 
     //     </root>" 
    } 
+0

是的,我可以肯定地看到你要去哪裏與此。感謝您的意見,但我可能會藉此機會學習Regex。 –