C# 用td和属性替换td标签

C# 用td和属性替换td标签,c#,.net,winforms,visual-studio,html-table,C#,.net,Winforms,Visual Studio,Html Table,我的问题是在我的项目中发生的特殊情况 在我的Html文档中, 我想 将所有tds的替换为,标签中的第一个tds除外。(如果标记中有,则也需要处理该标记) 如果输入类似于: <tr> <td>1</td> <td>2</td> <td>3</td> <tr> 1. 2. 3. 输出应如下所示: <tr> <td>1</td> <td c

我的问题是在我的项目中发生的特殊情况

在我的Html文档中, 我想 将所有tds的
替换为
,标签中的第一个tds除外。(如果
标记中有
,则也需要处理该标记)

如果输入类似于:

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

1.
2.
3.
输出应如下所示:

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

1.
2.
3.
我已经试过了…这个代码

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;
        }

publicstaticstringtableformat(stringhtml)//为td添加额外属性
{
int start=0,end=0,trstart=0,trend=0;
//html=CleanUpXHTML(html);//清除不必要的p标记
while(html.Contains(“”)
{
//开始=结束;
trstart=html.IndexOf(“,end”);
如果(trstart==-1)
打破
趋势=html.IndexOf(“,trstart);
start=html.IndexOf(“,trstart”);
end=html.IndexOf(“,趋势);
而(结束<趋势)
{
start=html.IndexOf(“,end”);
html=html.Insert(start+3,“class=\“right\”);
end=html.IndexOf(“,trstart”);
}
}
返回html;
}

只需从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);
    }
publicstaticstringtableformat(stringxhtml)
{
int start=0,end=0,trstart=0,trend=0;
while(trstart!=-1)
{
//开始=结束;
trstart=xhtml.IndexOf(“,end”);
如果(trstart==-1)
打破
趋势=xhtml.IndexOf(“,trstart);
start=xhtml.IndexOf(“,trstart”);
end=xhtml.IndexOf(“,start”);
而(结束<趋势)
{
//int trackTr=0;
start=xhtml.IndexOf(“,end”);
如果(开始>趋势)
打破
xhtml=xhtml.Insert(start+3,“class=\“right\”);
end=xhtml.IndexOf(“,start”);
}
}
返回(xhtml);
}

您是否已仔细阅读此代码并验证其是否按预期工作?HTML对标记大小写和空格等内容非常宽容,但您的方法却不是;如果HTML的格式不是很明确,您的方法可能会失败。我想看看

此外,您可能希望在其中构建更多的灵活性。它现在可能可以工作(一旦问题得到解决),但如果源HTML发生变化,将来可能不会

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

像这样处理嵌套结构在正则表达式中是不可能的

Regex是一个非常糟糕的处理HTML的工具。帮你自己一个忙,找一个合适的解析器,你的代码会更简单、更可靠。例如:


考虑使用正则表达式

        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);
string模式=@“(?\s*)”;
字符串测试=@“
1.
2.
3.
";
字符串结果=Regex.Replace(测试,模式,“,RegexOptions.IgnoreCase | RegexOptions.Multiline);
WriteLine(“{0}”,result);

这适用于大写或小写以及和之间的任意数量的空格。除空格以外的任何内容都会导致此操作失败。

public static string tableFormat(string html)//为td{while(html.Contains(“”){//start=end;trstart=html.IndexOf(“,end);if(trstart==-1)添加额外属性break;trend=html.IndexOf(“,trstart);start=html.IndexOf(“,trstart);end=html.IndexOf(“,start);}}返回html;}不工作似乎他想让它成为铁杆!!就像他说的,可能是为了某个特殊的目的。但是,如果在将来的某个时刻,TD标记已经包含class属性,该怎么办?或者如果标签写为“或”“或”“或”“或其他变体呢?他现在可以控制它,但一旦它上线,其他人拿到代码,所有赌注都没有了。这不是争论,但OP没有指定“有效的xhtml”。“这样我就让它掉下去了。那在另一个标签里呢?”?我觉得不可能?这是可能的,但不是有效的html。该示例在“仅忽略空白”中找到第一个
        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);