Удалите пробелы между тегами таблицы

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

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>

Я вижу, что вы пытаетесь сделать, но могу ли я спросить, почему вы пытаетесь это сделать?

JO3-W3B-D3V 31.12.2018 14:58

В React я конвертирую строку в элемент JSX. Но когда есть пробельные символы, это выдаст ошибку: текстовые узлы с пробелами не могут отображаться как дочерние элементы <table>. Я не хочу влиять на все остальные элементы вне таблицы.

Ben Besuijen 31.12.2018 15:04

Если вы пытаетесь минимизировать свой код, есть много готовых минификаторов, используя регулярное выражение для разбора HTML приводит к безумию

Liam 31.12.2018 15:06

Вот несколько ресурсов, которые помогут в этом: i.pinimg.com/originals/f4/e8/35/…, pics.me.me/…, s3.amazonaws.com/websitebeaver/blog/…

shanks 31.12.2018 15:09
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
5
1 018
2

Ответы 2

Объяснение

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

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

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.info(newResult);

Хороший! почти готово. Будет выведено <tableclass = "foo"> Я могу попробовать исправить это :)

Ben Besuijen 31.12.2018 15:37

@BenBesuijen Я обновил свой ответ, я думаю, теперь он работает так, как вы ожидали?

JO3-W3B-D3V 31.12.2018 16:13

Спасибо за вашу помощь. Я могу использовать твое решение

Ben Besuijen 31.12.2018 16:18

@BenBesuijen Не беспокойтесь, я рад, что смог помочь! :)

JO3-W3B-D3V 31.12.2018 16:24

Пробел между Lorem и ipsum исчез. Не то, что нужно.

Toto 31.12.2018 17:10

@Toto для простоты, я немного обновил его ... Никаких огромных изменений, никакой беспорядочной логики, просто простое, легко готовое и минимальное решение IMO для этой проблемы, но спасибо, что указали на это, потому что ни Бен, ни я бы это не заметили! Спасибо! :)

JO3-W3B-D3V 31.12.2018 17:40

Я видел, что вы хотели исправить эту ошибку - Узлы с пустым текстом не могут отображаться как дочерние элементы <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.

и это хрупкое, например это не сработает, если у элементов есть атрибуты

ChrisW 25.06.2019 17:26

Другие вопросы по теме