用td和属性替换td标签

时间:2010-09-23 10:38:32

标签: c# .net winforms visual-studio html-table

我的问题是针对我项目中发生的特殊情况。

在我的Html文档中, 我想要 对于除<td>标记中的第一个之外的所有tds,将<td class=”right”>替换为<tr>。 (如果<tr>标记内有<tr>,那么也需要处理)。

如果输入如下:

<tr>
  <td>1</td>
  <td>2</td>
  <td>3</td>
<tr>

输出应该是:

<tr>
  <td>1</td>
  <td class=”right”>2</td>
  <td class=”right”>3</td>
<tr>

我试过......这段代码..

public static string tableFormat(string html)   // Add extra attribute to td
        {
            int start = 0, end = 0, trstart = 0, trend = 0;
           // html = CleanUpXHTML(html);  // clean unnecessary p tags
            while (html.Contains("<tr>"))
            {
                //start=end;
                trstart = html.IndexOf("<tr>", end);
                if (trstart == -1)
                    break;
                trend = html.IndexOf("</tr>", trstart);
                start = html.IndexOf("<td>", trstart);
                end = html.IndexOf("</td>", trend);
                while (end < trend)
                {

                    start = html.IndexOf("<td>", end);
                    html = html.Insert(start + 3, " class=\"right\"");
                    end = html.IndexOf("</td>", trstart);

                }
            }
            return html;
        }

4 个答案:

答案 0 :(得分:0)

从main调用此函数: 注意:此代码适用于有效的html,即xhtml

 public static string TableFormat(string xhtml)
    {
        int start = 0, end = 0, trstart = 0, trend = 0;

        while (trstart != -1)
        {
            //start=end;
            trstart = xhtml.IndexOf("<tr>", end);
            if (trstart == -1)
                break;
            trend = xhtml.IndexOf("</tr>", trstart);
            start = xhtml.IndexOf("<td>", trstart);
            end = xhtml.IndexOf("</td>", start);
            while (end < trend)
            {
                //int trackTr = 0;
                start = xhtml.IndexOf("<td>", end);
                if (start > trend)
                    break;
                xhtml = xhtml.Insert(start + 3, " class=\"right\"");

                end = xhtml.IndexOf("</td>", start);

            }
        }
        return (xhtml);
    }

答案 1 :(得分:0)

您是否已逐步完成此代码并验证其是否按预期工作? HTML对标签案例和空格等内容非常宽容,但您的方法不是;如果HTML没有专门格式化非常,您的方法可能会失败。我来看看。

此外,您可能希望为其构建更多灵活性。它现在可能有效(一旦你解决了问题),但如果源HTML发生变化,将来可能不会。

答案 2 :(得分:0)

  

如果有标签内部,那么也需要处理

使用正则表达式无法处理这样的嵌套结构。

正则表达式是一种非常糟糕的操作HTML的工具。帮自己一个忙,让自己找一个合适的解析器,你的代码会更简单,更可靠。例如。与HTML Agility Pack

HtmlDocument doc= new HtmlDocument();
doc.LoadHtml(html);
foreach (HtmlNode td in doc.DocumentElement.SelectNodes("//tr/td[position()>1]"]) {
    td.SetAttributeValue("class", "right");
}

答案 3 :(得分:0)

考虑使用正则表达式......

        string pattern = @"(?<!(<tr>\s*))<td>";
        string test = @"<tr> 
                          <td>1</td> 
                          <td>2</td> 
                          <td>3</td> 
                        </tr> ";
        string result = Regex.Replace(test, pattern, "<td class=\"right\">", RegexOptions.IgnoreCase | RegexOptions.Multiline);
        Console.WriteLine("{0}", result);

这适用于大写或小写以及&lt; tr&gt;之间的任何数量的空白。和&lt; td&gt;。除了空格之外的任何东西都会导致失败。