代码之家  ›  专栏  ›  技术社区  ›  NickAldwin

在<td>标记内替换<p>、<div>标记?

  •  2
  • NickAldwin  · 技术社区  · 17 年前

    我正在研究一个专门的HTML剥离器。当前的剥离器将<td>标记替换为制表符,然后<p>和<div>标记替换为双回车符。但是,当剥离这样的代码时:

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

    它(显然)产生

    First Text
    
    Some Text
    

    在这种情况下,我们希望将<P>替换为“无”,因此它产生:

    First Text (tab) Some Text
    

    但是,如果<P>标记未被<TD>标记包围,我们希望保留双回车替换的其他代码。

    基本上,我们尝试用“始终”和“P>”;以及“仅当标记未被<TD>标记包围时,才将<TD>标记替换为\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敏捷包。

    大多数情况下,剥离器只是剥离出它发现的任何看起来像标签的东西(用一个基于正则表达式食谱中regex的大型regex完成)。这样,用/r替换换行符标签,处理多个标签是定制剥离代码的首当其冲。

    4 回复  |  直到 16 年前
        1
  •  2
  •   Dillie-O    17 年前

    你有没有想过调查 HTML Agility Pack ,哪一个内置了很多解析选项来操作标记?

        2
  •  2
  •   Jan Goyvaerts    16 年前

    找到答案:

      // 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 (一直坐在我面前,噢!)这真是一本好书。

        3
  •  0
  •   Chris Doggett    17 年前

    我没有用正则表达式写的答案,但是我强烈推荐 HTML Agility Pack 像这样的事情。您应该能够用一个简单的选择器轻松地找到节点,并用您想要的替换它们。

        4
  •  0
  •   Dillie-O    17 年前

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

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