替换标签中的<p>,</p> <div>标签?</div>

时间:2009-07-23 17:47:47

标签: c# .net html regex strip

我正在开发一个专门的HTML剥离器。当前的剥离器取代了&lt; td&gt;。带标签的标签然后&lt; p&gt;和&lt; div&gt;带有双回车的标签。但是,在剥离代码时这样:

<td>First Text</td><td style="background:#330000"><p style="color:#660000;text-align:center">Some Text</p></td>

它(显然)产生

First Text

Some Text

我们想要&lt; p&gt;在这种情况下替换为空,所以它产生:

First Text (tab) Some Text

但是,我们希望保留&lt; p&gt;的其他代码的双回车符替换。标签未被&lt; td&gt;包围标签

基本上,我们正在尝试替换&lt; td&gt;带有\ t的标签始终和&lt; p&gt;和&lt; div&gt;只有在未被&lt; td&gt;包围的情况下才能使用\ r \ n \ r \ n标记标签

当前代码:(C#)

  // insert tabs in places of <TD> tags
  result = System.Text.RegularExpressions.Regex.Replace(result,
           @"<td\b(?:[^>""']|""[^""]*""|'[^']*')*>", "\t",
           System.Text.RegularExpressions.RegexOptions.IgnoreCase);  

  // insert line paragraphs (double line breaks) in place
  // of <P>, <DIV> and <TR> tags
  result = System.Text.RegularExpressions.Regex.Replace(result,
           @"<(div|tr|p)\b(?:[^>""']|""[^""]*""|'[^']*')*>", "\r\r",
           System.Text.RegularExpressions.RegexOptions.IgnoreCase);

(剥离器有更多代码;这是相关部分)

如何在不完全重写整个脱衣舞娘的情况下如何做到这一点?

编辑: 我宁愿不使用图书馆,因为令人头疼的是它已经签署并包含在项目中(它本身就是一个要包含在另一个项目中的库),更不用说法律问题了。但是,如果没有其他解决方案,我可能会使用HTML Agility Pack。

大多数情况下,剥离器只是剥离它看起来像标签的任何东西(在正则表达式手册中使用基于正则表达式的大型正则表达式完成。这样,用/ r替换换行标记,并处理多个标签是自定义剥离代码首当其冲。

4 个答案:

答案 0 :(得分:2)

您是否考虑过查看HTML Agility Pack,它会内置很多可以处理标记的解析选项?

答案 1 :(得分:2)

找到答案:

  // remove p/div/tr inside of td's
  result = System.Text.RegularExpressions.Regex.Replace(result, @"<td\b(?:[^>""']|""[^""]*""|'[^']*')*>.*?</td\b(?:[^>""']|""[^""]*""|'[^']*')*>", new MatchEvaluator(RemoveTagsWithinTD));

此代码为每个匹配调用此单独的方法:

  //a separate method
  private static string RemoveTagsWithinTD(Match matchResult) {
      return Regex.Replace(matchResult.Value, @"<(div|tr|p)\b(?:[^>""']|""[^""]*""|'[^']*')*>", "");
    }

这段代码(再次)基于Regular Expressions Cookbook的另一个食谱(一直坐在我面前,噢!)。这真是一本很棒的书。

答案 2 :(得分:0)

就使用正则表达式编写它我没有答案,但我强烈推荐HTML Agility Pack这样的事情。您应该能够使用简单的选择器轻松找到节点,并将其替换为您想要的任何节点。

答案 3 :(得分:0)

因此,如果您无法使用敏捷包。如果您创建了一个检查块存在的简单匹配,该怎么办?如果它存在,那么你可以对块内的标签进行所有正确的替换,否则有第二组替换适用于不在块内的标签。

无需重写现有替代品,只需为您的其他条件创建一个更简单的替换品。我想这取决于在HTML剥离的一个“单元”中解析了多少文本。