Подтвердить что ты не робот

Замените несколько файлов только одним

Как использовать JavaScript для обнаружения

<br>
<br>
<br>

чтобы стать одним

<br>

?

Я пробовал:

jQuery('body').html().replace(/(\<br\>\r\n){3, }/g,"\n");

но это не работает для меня.

4b9b3361

Ответ 1

Simpler:

var newText = oldText.replace(/(<br\s*\/?>){3,}/gi, '<br>');

Это позволит использовать дополнительный терминатор тегов (/" > ), а также пробелы до конца тега (например, <br /> или <br >).

Ответ 2

Решение для CSS

Если вы хотите отключить эффект нескольких <br> на странице, вы можете сделать это с помощью CSS без использования JavaScript:

br + br { display: none; }

Однако этот метод идеален, когда вы работаете с тегами, примерно так:

<div>Text</div><br /><br /><br />
<div>Text</div><br /><br /><br />
<div>Text</div><br /><br /><br />

В других случаях, например:

Hello World<br />   <br />
Hello World<br />   <br />
Hello World<br />   <br />

Он будет терпеть неудачу (поскольку CSS передает текстовые узлы). Вместо этого используйте JavaScript-решение.


Решение для JavaScript

// It better to wait for document ready instead of window.onload().
window.onload = function () {
    // Get all `br` tags, defined needed variables
    var br = document.getElementsByTagName('br'),
        l = br.length,
        i = 0,
        nextelem, elemname, include;

    // Loop through tags
    for (i; i < l - 1; i++) {
        // This flag indentify we should hide the next element or not
        include = false;

        // Getting next element
        nextelem = br[i].nextSibling;

        // Getting element name
        elemname = nextelem.nodeName.toLowerCase();

        // If element name is `br`, set the flag as true.
        if (elemname == 'br') {
            include = true;
        }

        // If element name is `#text`, we face text node
        else if (elemname == '#text') {
            // If text node is only white space, we must pass it.
            // This is because of something like this: `<br />   <br />`
            if (! nextelem.data.replace(/\s+/g, '').length) {
                nextelem = br[i+1];
                include = true;
            }
        }

        // If the element is flagged as true, hide it
        if (include) {
            nextelem.style.display = 'none';
        }
    }
};

Ответ 3

Какой смысл отправлять HTML-код, который не нужен, в клиентский браузер и запускать его JavaScript код для очистки? Это выглядит плохой дизайн.

Как насчет исправления всего вашего статического HTML и генерации HTML, чтобы эти лишние элементы <br> не встречались в первую очередь?

Если вы используете JavaScript для изменения объекта документа, сделайте это для динамических эффектов, которые не могут быть достигнуты каким-либо другим способом.

Ответ 4

Не было бы такого, чтобы это было правильным:

$("br~br").remove()

EDIT: Нет, это неправильно, потому что его определение "смежный" слишком слабое, как в BoltClock.

Ответ 5

Попробуйте следующее:

jQuery('body').html(
      jQuery('body').html().replace(/(?:<br>\s+){3,}/ig,"\n"));
);

DEMO:  jsfiddle

Ответ 6

Попробуйте это

$('body').html($('body').html().replace(/(<br>)+/g,"<br>"));

Он заменит n число <br> на одно.

Демо

Ответ 7

Я бы пошел с этим:

$('body').html($('body').html().replace(/<br\W?\\?>(\W?(<br\W?\\?>)+)+/g,"<br>"));

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

Ответ 8

Это решение только для jQuery + DOM, не управляет HTML как строка, работает с текстовыми узлами, игнорирует только текстовые узлы с пробелами:

$('br').each(function () {
  const {nodeName} = this;

  let node = this;

  while (node = node.previousSibling) {
    if (node.nodeType !== Node.TEXT_NODE || node.nodeValue.trim() !== '') {
      break;
    };
  }

  if (node && node !== this && node.nodeName === nodeName) {
    $(node).remove();
  }
});

Смотрите: https://jsfiddle.net/kov35jct/