Замена тд тегов тд и атрибутами - PullRequest
1 голос
/ 23 сентября 2010

Моя проблема касается конкретного случая, происходящего в моем проекте.

В моем HTML-документе я хочу заменить <td> на <td class=”right”> для всех tds, кроме первого в теге <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;
        }

Ответы [ 4 ]

0 голосов
/ 23 сентября 2010

Попробуйте использовать регулярное выражение ...

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

Это работает с прописными или строчными буквами и любым количеством пробелов между

и .Все, кроме пробелов, может привести к сбою.
0 голосов
/ 23 сентября 2010

Вы прошли этот код и убедились, что он работает как задумано?HTML очень прощает такие вещи, как регистр тегов и пробелы, но ваш метод - нет;если HTML не отформатирован очень конкретно, ваш метод, скорее всего, потерпит неудачу.Я бы посмотрел на это.

Также, возможно, вы захотите придать ему больше гибкости.Это может сработать сейчас (как только вы решите проблему), но если исходный HTML-код когда-либо изменится, в будущем это может не произойти.

0 голосов
/ 23 сентября 2010

если есть внутри тега, то это также необходимо обработать

Подобные операции с вложенными структурами невозможны с регулярным выражением.

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");
}
0 голосов
/ 23 сентября 2010

просто вызовите эту функцию из 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);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...