【问题标题】:Replacing <p>, <div> tags within <td> tags?替换 <td> 标签中的 <p>、<div> 标签?
【发布时间】:2009-07-23 17:47:47
【问题描述】:

我正在开发一个专门的 HTML 剥离器。当前的剥离器将

标记替换为制表符,然后将

标记替换为双回车符。但是,当像这样剥离代码时:
<td>First Text</td><td style="background:#330000"><p style="color:#660000;text-align:center">Some Text</p></td>

它(显然)产生

First Text

Some Text

在这种情况下,我们希望将

替换为空,因此它会生成:

First Text (tab) Some Text

但是,对于

标签未被

标签包围的其他代码,我们希望保留双回车替换。

基本上,我们尝试将

标记替换为 \t,而将

标记替换为 \r\r 仅当它们没有被 标记包围时。

当前代码:(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 替换换行符标签,并处理多个选项卡是自定义剥离代码首当其冲。

【问题讨论】:

  • 有趣的更新。所以我想关于这件事要问的一件事是,您是否要操纵比列出的标签更多的标签?我不确定什么会花费更多时间,从头开始编写自己的解析器,尝试找到所有细微差别,或者花时间在已经为你完成的库上签收。
  • 我们只进行了一些自定义操作 - 主要是剥离标签。请参阅上面的第二次编辑。

标签: c# .net html regex strip


【解决方案1】:

您是否考虑过查看HTML Agility Pack,它会内置很多解析选项来操作标签?

【讨论】:

  • 我不想使用库;见上文。
【解决方案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 的另一个配方(它一直坐在我面前,天哪!)。这真是一本好书。

【讨论】:

  • 很高兴听到您喜欢正则表达式食谱。如果您的任何朋友还没有副本,O'Reilly 和我正在 regexguru.com 上做一个赠品,任何人都可以参加,直到月底(2010 年 2 月 28 日)。
【解决方案3】:

就使用正则表达式编写它而言,我没有答案,但我强烈推荐HTML Agility Pack 用于类似的事情。您应该能够使用简单的选择器轻松找到节点,然后将它们替换为您想要的任何内容。

【讨论】:

  • 我不想使用库;见上文。
【解决方案4】:

所以如果你不能使用敏捷包。如果您创建了一个简单的匹配来检查块的存在会怎样。如果它存在,那么您可以对块内的标签进行所有适当的替换,否则有第二组替换适用于不在块内的标签。

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

【讨论】:

  • 在一行和整个文档之间变化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多