我的问题是针对我项目中发生的特殊情况。
在我的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;
}
答案 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;。除了空格之外的任何东西都会导致失败。