2010-09-23 83 views
1

我的问题是针对我的项目中发生的特定情况。用td和属性替换td标签

在我的HTML文档, 我想 与<td class=”right”>为除了在<tr>标签第一个所有TD更换<td>。 (如果在<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> 

我已经tried..this代码..

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

公共静态字符串tableFormat(字符串HTML)//添加额外的属性,以TD {而(html.Contains( “”)){ // 开始=结束; trstart = html.IndexOf(“”,end); if(trstart == -1) break; trend = html.IndexOf(“”,trstart); start = html.IndexOf(“​​”,trstart); end = html。IndexOf(“”,start); } } return html; } 不工作 – 2010-09-23 10:42:50

回答

0

只是调用这个函数从主: 注意:此代码将适用于有效的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); 
    } 
0

您是否已通过此代码并验证其按预期工作? HTML对于标记大小写和空格等东西是非常宽容的,但是你的方法不是;如果HTML未格式化,特别是非常具有,那么您的方法可能会失败。我会看看那个。

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

+0

好像他想要它是硬核!如他所说,可能会出于某种特定目的。 – 2010-09-23 10:56:52

+0

好的。但是,如果在某个时刻,TD标签已经包含类属性?或者,如果标签被写为“或” “或” “或其他一些变异?他现在可以控制它,但一旦去生活和其他人得到他们的手代码,所有的赌注都关闭。 – 2010-09-23 11:00:20

+0

它只是作为他先前指定将努力为有效的XHTML。 – 2010-09-23 11:07:43

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

这适用于上或下壳体和空白的betweent的< TR>任何量和< TD>。除了空格以外的任何内容都会导致失败。

+0

怎么样另一标签里面?iguess不可能!!? – 2010-09-27 04:12:50

+0

这是可能的,但不是有效的html。该示例发现中的第一个​​只忽略了空白 – Les 2010-09-27 16:30:05