Удалить пробелы между тегами таблицы - PullRequest
0 голосов
/ 31 декабря 2018

Мне нужно регулярное выражение (или другое хорошее решение), которое будет соответствовать пробелам только между тегами внутри таблицы .Мое текущее регулярное выражение будет соответствовать пробелу между всеми тегами.

const result = `
<div>
  <table class="foo">
    <tr>
      <td>
        Lorem ipsum
      </td>
    </tr>
    <tr>
      <td>
        Dolor
      </td>
    </tr>
  </table>
</div>
`.replace(/>\s+</g, '><');

Я хочу добиться этого:

<div>
  <table class="foo"><tr><td>Lorem ipsum</td></tr><tr><td>Dolor</td></tr></table>
</div>

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

Я видел, что вы хотели, чтобы он исправил эту ошибку - Узлы пробельных символов не могут отображаться как дочерний элемент <table> - в пакете html-to-react.

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

      // React expect no whitespace between table elements
      sliced = sliced.replace(/<table>\s*<thead>/g, "<table><thead>");
      sliced = sliced.replace(/<table>\s*<tbody>/g, "<table><tbody>");
      sliced = sliced.replace(/<thead>\s*<tr>/g, "<thead><tr>");
      sliced = sliced.replace(/<tbody>\s*<tr>/g, "<tbody><tr>");
      sliced = sliced.replace(/<tr>\s*<th>/g, "<tr><th>");
      sliced = sliced.replace(/<tr>\s*<td>/g, "<tr><td>");

      sliced = sliced.replace(/<\/thead>\s*<tbody>/g, "</thead><tbody>");

      sliced = sliced.replace(/<\/thead>\s*<\/table>/g, "</thead></table>");
      sliced = sliced.replace(/<\/tbody>\s*<\/table>/g, "</tbody></table>");
      sliced = sliced.replace(/<\/tr>\s*<\/thead>/g, "</tr></thead>");
      sliced = sliced.replace(/<\/tr>\s*<\/tbody>/g, "</tr></tbody>");
      sliced = sliced.replace(/<\/th>\s*<\/tr>/g, "</th></tr>");
      sliced = sliced.replace(/<\/td>\s*<\/tr>/g, "</td></tr>");

      sliced = sliced.replace(/<\/tr>\s*<tr>/g, "</tr><tr>");
      sliced = sliced.replace(/<\/th>\s*<th>/g, "</th><th>");
      sliced = sliced.replace(/<\/td>\s*<td>/g, "</td><td>");

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

0 голосов
/ 31 декабря 2018

Объяснение

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

С этим решением, учитывая, что вы хотите нацеливать теги таблиц конкретно, я думаю, что этого должно быть достаточно?

let words = ['Lorum ipsum', 'Dolor'];
let result = `
<div>
  <table class="foo" id="demo" style="">
    <tr>
      <td>
        words[0]
      </td>
    </tr>
    <tr>
      <td>
        words[1]
      </td>
    </tr>
  </table>
</div>
`;

let newResult = '';

const cleanseString = str => {
  const attributes = ['id', 'class', 'style']; // etc ...
  str = str.replace(/\s/g, '');
  const index = str.replace(/\D/g, '');
  const marker = `words[${index}]`;

  if (str.indexOf(marker) >= 0) {
    str = str.replace(marker, words[index]);
  }

  attributes.forEach(attr => {
    if (str.indexOf(attr) >= 0) {
      let start = '',
        end = '';
      start = str.substring(0, str.indexOf(attr));
      end = str.substring(str.indexOf(attr), str.length);
      str = start + " " + end;
    }
  });

  return str;
};

result.split("<").forEach(str => {
  str = cleanseString(str);

  if (str != '') {
    if (str.indexOf("/table") >= 0) newResult += "<" + str + '\n';
    else if (str.indexOf('table') >= 0) newResult += '\n\t' + "<" + str;
    else newResult += "<" + str;
  }
});

//console.clear();
console.log(newResult);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...