【问题标题】:Replacing td tags with td and attributes用 td 和属性替换 td 标签
【发布时间】:2016-12-06 03:27:46
【问题描述】:

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

在我的 Html 文档中, 我想要 将<td> 替换为<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>

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

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

【问题讨论】:

  • public static string tableFormat(string html) // 添加额外属性到 td { while (html.Contains("")) { //start=end; trstart = html.IndexOf(" ", end); if (trstart == -1) 中断;趋势 = html.IndexOf("", trstart);开始 = html.IndexOf("", trstart); end = html.IndexOf("", start); } } 返回 html; } 不工作

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


【解决方案1】:

只需从 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);
    }

【讨论】:

    【解决方案2】:

    您是否已单步执行此代码并验证其是否按预期工作? HTML 对标签大小写和空格之类的东西非常宽容,但您的方法不是;如果 HTML 的格式不是 very,那么您的方法可能会失败。我会看看那个。

    此外,您可能希望在其中增加一些灵活性。它现在可能可以工作(一旦你解决了问题),但如果源 HTML 发生变化,将来可能不会。

    【讨论】:

    • 好像他想要硬核!!正如他所说,可能是出于某种特定目的。
    • 好的。但是,如果在某个时候,TD 标签已经包含了一个类属性呢?或者如果标签写成“ 或“ ”或“ ”或其他一些变体怎么办?他现在可以控制它,但一旦它上线并且其他人得到代码,所有赌注没有了。
    • 没有争论,但 OP 没有指定“有效的 xhtml”。有了它,我就让它掉下来。
    【解决方案3】:

    如果标签里面有,那也需要处理

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

    Regex 是一个非常糟糕的 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");
    }
    

    【讨论】:

      【解决方案4】:

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

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

      这适用于大写或小写以及

      和 之间的任意数量的空格。空格以外的任何内容都会导致此操作失败。

      【讨论】:

      • 另一个 标签内的 怎么样?估计不可能!! ?
      • 有可能,但不是有效的 html。该示例在 中找到第一个 ,仅忽略空格
      猜你喜欢
      相关资源
      最近更新 更多
      热门标签