2011-11-14 36 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。 –