C# 用td和属性替换td标签
我的问题是在我的项目中发生的特殊情况 在我的Html文档中, 我想 将所有tds的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
替换为
,标签中的第一个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);